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

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

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


当前回答

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

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

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

其他回答

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

ThenBy() extension method

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

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

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

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

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

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

如前所述,延迟加载和延迟执行

LINQ to object和LINQ to XML (IEnumerable)与LINQ to SQL(IQueryable)有何不同

如何建立一个数据访问层,业务层,和表示层与LINQ在所有层....这是个很好的例子。

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

Explain why Linq does not handle left outer join as simple as in sql syntax. See this articles: Implementing a Left Join with LINQ, How to: Perform Left Outer Joins (C# Programming Guide) I got so disappointed when I came across this obstacle that all my respect for the language vanished and I decedid that it was just something that quickly would fade away. No serious person would want to work with a syntax that lacks these battlefield proven primitives. If you could explain why these sort of set operation are not supported. I would become a better and more openminded person.