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

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

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


当前回答

我不认为每个人都能理解嵌套循环有多容易。

例如:

from outerloopitem in outerloopitems
from innerloopitem in outerloopitem.childitems
select outerloopitem, innerloopitem

其他回答

编译查询

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的错误消息可能非常令人困惑。露齿而笑

和其他人一样,我也被推迟执行的问题困扰过几次。我认为对我来说最困惑的事情是SQL Server查询提供程序,以及你能用它做什么和不能做什么。

我仍然惊讶于你不能在有时为空的小数/货币列上执行Sum()。使用DefaultIfEmpty()是行不通的。:(

我仍然有问题的“让”命令(我从来没有发现一个用途)和SelectMany(我已经使用过,但我不确定我是否做对了)

如何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的代码并在观察窗口中进行操作来解决。