背景:在接下来的一个月里,我将做三次关于LINQ的演讲,或者至少将LINQ包含在c#的上下文中。我想知道哪些话题值得花相当多的精力,这取决于人们可能很难理解哪些话题,或者他们可能有错误的印象。我不会具体讨论LINQ to SQL或实体框架,只是作为如何使用表达式树(通常是IQueryable)远程执行查询的示例。

那么,你发现LINQ有什么难的地方吗?在误解方面你看到了什么?例子可能是以下任何一个,但请不要限制自己!

c#编译器如何处理查询表达式 Lambda表达式 表达式树 扩展方法 匿名类型 这个IQueryable 延迟执行与立即执行 流与缓冲执行(例如,OrderBy被延迟但被缓冲) 隐式类型局部变量 读取复杂的泛型签名(例如Enumerable.Join)


当前回答

我发现很难找到关于匿名类型的明确信息,特别是在web应用程序的性能方面。 此外,我会建议更好和实用的lambda表达式示例和“如何”部分在查询和性能相关的主题。

希望我的简短清单能有所帮助!

其他回答

当然,这并不是“最困难的”,只是需要添加到列表中:

ThenBy() extension method

没有看到它的实现,我最初对它是如何工作的感到困惑。每个人都能很好地理解逗号分隔的排序字段在SQL中是如何工作的——但从表面上看,我怀疑ThenBy会做我真正想要它做的事情。它怎么能“知道”之前的排序字段是什么呢——看起来它应该知道。

我现在要去研究一下了……

我认为关于LINQ to SQL的第一个误解是,你仍然必须了解SQL才能有效地使用它。

关于Linq to Sql的另一个误解是,为了让它工作,你仍然必须降低数据库的安全性到荒谬的地步。

第三点是将Linq to Sql与动态类一起使用(意味着类定义是在运行时创建的)会导致大量的即时编译。这绝对会破坏性能。

The fact that you can't chain IQueryable because they are method calls (while still nothing else but SQL translateable!) and that it is almost impossible to work around it is mindboggling and creates a huge violation of DRY. I need my IQueryable's for ad-hoc in which I don't have compiled queries (I only have compiled queries for the heavy scenarios), but in compiled queries I can't use them and instead need to write regular query syntax again. Now I'm doing the same subqueries in 2 places, need to remember to update both if something changes, and so forth. A nightmare.

如何LINQ到SQL翻译它!

假设我们有一个有3个字段的表;A, B和C(它们是整数,表名为“Table1”)。 我是这样展示的: [a, b, c]

现在我们想要得到这样的结果: [x = a, y = b + c]

我们有这样一门课:

public class Temp
{
   public Temp(int x, int y)
   {
      this.X = x;
      this.Y = y;
   }

   public int X { get; private set; }
   public int Y { get; private set; }
}

然后我们这样使用它:

using (MyDataContext db = new MyDataContext())
{
   var result = db.Table1.Select(row => 
                   new Temp(row.A, row.B + row.C)).ToList();
}

生成的SQL查询是:

SELECT [t0].[A] AS [x], [t0].[B] + [t0].[C] AS [y]
FROM [Table1] AS [t0]

它转换了Temp的.ctor,它知道我想要“row”。B + row.C”(甚至更多…)放在我的类构造函数的“y”参数上!

我对这些译文很感兴趣。我喜欢这样,我认为编写这样的翻译器(LINQ to Something)有点难!

当然!这是一个坏消息:LINQ to Entities(4.0)不支持带参数的构造函数。(为什么不呢?)

正如大多数人所说,我认为最被误解的部分是假设LINQ只是T-SQL的替代品。 我的经理认为自己是一个TSQL专家,他不让我们在项目中使用LINQ,甚至讨厌微软发布这样的东西!!