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

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

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


当前回答

它不仅仅是LINQ to SQL,它的特性也不仅仅是嵌入在语言中的SQL解析器。

其他回答

编译查询

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.

我认为Lambda表达式可以解析表达式树和匿名委托的事实,因此您可以将相同的声明性Lambda表达式传递给IEnumerable<T>扩展方法和IQueryable<T>扩展方法。

在LINQ to SQL中,我经常看到人们不理解DataContext,它可以如何使用以及应该如何使用。太多的人看不到DataContext是什么,它是一个工作单元对象,而不是一个持久化对象。

我见过很多次,人们试图单例化一个DataContext/ session it/ etc,而不是为每个操作创建一个新的时间。

然后是在IQueryable被评估之前处理DataContext但那更多的是人们不理解IQueryable而不是DataContext。

另一个我经常混淆的概念是查询语法和表达式语法。在这一点上,我将使用最简单的方法,通常坚持使用表达式语法。很多人仍然没有意识到他们最终会生成相同的东西,查询终究被编译成表达式。

哪个更快,内联Linq-to-Sql还是使用Tsql spprocs的Linq-to-Sql

... 是否有使用服务器端(Sproc)或客户端(内联Linq)查询更好的情况。

它不仅仅是LINQ to SQL,它的特性也不仅仅是嵌入在语言中的SQL解析器。