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

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

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


当前回答

我打赌几乎有人知道:你可以在linq查询中使用内联if。就像这样:

var result = from foo in bars where (
    ((foo.baz != null) ? foo.baz : false) &&
    foo.blah == "this")
    select foo;

我猜你也可以插入,尽管我还没试过。

其他回答

我认为人们对LINQ的误解在于它是一种语言扩展,而不是数据库扩展或构造。

LINQ不仅仅是LINQ to SQL。

现在我们大多数人都在集合上使用了LINQ,我们再也不会回去了!

LINQ是。net自2.0的泛型和3.0的匿名类型以来最重要的特性。

现在我们有了Lambda,我等不及要进行并行编程了!

我最初没有意识到的是,LINQ语法不需要IEnumerable<T>或IQueryable<T>来工作,LINQ只是关于模式匹配。

可选文字 http://bartdesmet.info/images_wlw/QIsIQueryabletheRightChoiceforMe_13478/image_thumb_3.png

这就是答案(不,那篇博客不是我写的,是Bart De Smet写的,他是我发现的LINQ上最好的博主之一)。

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

事务(不使用TransactionScope)

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

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