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

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

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


当前回答

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

ThenBy() extension method

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

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

其他回答

延迟加载。

大O符号。LINQ使得编写O(n^4)算法变得非常容易,如果你不知道自己在做什么的话。

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

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

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

理解Linq提供者之间的抽象何时泄漏。有些东西适用于对象,但不适用于SQL(例如,. takewhile)。一些方法可以被翻译成SQL (ToUpper),而另一些则不能。有些技术在对象中更有效,而其他技术在SQL中更有效(不同的连接方法)。

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