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

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

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


当前回答

如何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)不支持带参数的构造函数。(为什么不呢?)

其他回答

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

好了,由于需要,我写了一些表达式的东西。我不是100%的满意博客和LiveWriter合谋的格式,但它现在做…

不管怎样,接下来……我希望得到任何反馈,特别是如果人们在某些方面需要更多信息的话。

就在这里,不管你喜不喜欢……

我很想知道我是否需要知道表达式树是什么,以及为什么。

我发现查询表达式语法只支持LINQ功能的一个子集,这有点令人失望,因此您无法避免时不时地链接扩展方法。例如,Distinct方法不能使用查询表达式语法调用。要使用Distinct方法,需要调用扩展方法。另一方面,查询表达式语法在许多情况下非常方便,所以您也不想跳过它。

关于LINQ的演讲可以包括一些实用的指导方针,比如什么时候更喜欢一种语法而不是另一种,以及如何混合使用它们。

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

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

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