LINQ中最难或者最容易被误解的方面是什么?

282

背景:在接下来的一个月里,我将会就涉及到或至少包含C#中的LINQ这一话题发表三次演讲。我想知道哪些主题值得重点关注,基于人们可能难以理解的问题,或者他们可能存在误解的问题。除了作为使用表达式树远程执行查询(通常是IQueryable)的示例外,我不会特别谈论LINQ到SQL或实体框架。

那么,你发现过什么使LINQ难以理解的问题?你看到有哪些误解?例如可以是以下任何一种情况,但请不要限制你自己!

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

3
我很想知道你们什么时候会进行这些演讲,以及是否有在线观看的方式。 - Mark Heath
2
第一场演讲:10月30日哥本哈根,希望能录制整个过程。(全天!) 第二场演讲:11月19日晚上伦敦,伦敦.NET用户组,可能会谈到Push LINQ。 第三场演讲:11月22日雷丁,开发者开发者日,60分钟内实现LINQ to Objects。 - Jon Skeet
1
下投票者请添加解释性评论。 - Jon Skeet
2
@Jon,抱歉,但我需要关闭这个。 - Tim Post
3
@Tim:说得对,反正它也没有得到更多的回答了。不过就我个人而言,我认为它最终还是很有建设性的——我确实觉得看看人们觉得什么棘手很有用。尽管如此,现在我可能不会再问这个问题了…… - Jon Skeet
显示剩余6条评论
42个回答

0

你不能链式调用IQueryable,因为它们是方法调用(虽然仍然只能翻译成SQL!)而且几乎不可能解决这个问题,这会导致DRY原则的严重违反。我需要我的IQueryable进行即席查询,在这种情况下我没有编译查询(我只有在重要场景下才有编译查询),但在编译查询中我不能使用它们,而是需要再次编写常规查询语法。现在我在两个地方做同样的子查询,如果有变化就需要记得更新两个地方等等。真是一场噩梦。


-1

有一件事情我敢打赌几乎没有人知道:你可以在Linq查询中使用内联if语句。就像这样:

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

我想你也可以插入lambda,尽管我还没有尝试过。


2
这只是一个条件表达式 - 为什么你不能使用它呢? - Jon Skeet
我曾经(可能是错误的)认为那就像一个普通的if语句:你不会看到任何嵌套的普通if语句,对吧?或者我可能错了... - RCIX
3
如果语句是一个陈述,而条件运算符是一个表达式。它们是同一概念的不同形式,用于分支控制。在这种情况下,您可以使用空值合并运算符"?? ",输入"foo.baz ?? false"即可。 - Bryan Watts
我认为更多的人知道三元运算符而不是相反的情况。 - devoured elysium
条件表达式产生布尔值时可以简化为布尔或/和表达式,因此(foo.baz != null) ? foo.baz : false等同于(foo.baz != null) && foo.baz。我认为这可以应用于任何可以作为“where”条件传递的三元表达式。所以在我看来,这并不令人惊讶。 - Justin Morgan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接