背景:在接下来的一个月里,我将在 C#
的背景下进行三次或至少包括 LINQ
的讨论 . 除了作为如何使用表达式树(通常是 IQueryable
)远程执行查询的示例之外,我还要特别谈论 LINQ
到 SQL
或实体框架 .
那么,你对_1835748发现了什么?你在误解方面看到了什么?示例可能是以下任何一种,但请不要限制自己!
-
C#
编译器如何处理查询表达式 -
Lambda表达式
-
表达式树
-
扩展方法
-
匿名类型
-
IQueryable
-
延迟与立即执行
-
流式传输与缓冲执行(例如,OrderBy延迟但缓冲)
-
隐式输入的局部变量
-
阅读复杂的通用签名(例如Enumerable.Join)
30 回答
好的,由于需求,我已经写了一些Expression的东西 . 我对博主和LiveWriter如何密谋对其进行格式化并不是百分之百的满意,但它现在会做...
无论如何,这里...我喜欢任何反馈,特别是如果有人想要更多信息的领域 .
Here it is,喜欢它还是恨它...
一些错误消息,尤其是从LINQ到SQL的错误消息可能会令人困惑 . 微笑
我和其他人一样被延迟执行了几次 . 我认为对我来说最令人困惑的是SQL Server查询提供程序以及您可以做什么和不能用它做什么 .
我仍然对你不能在有时为空的小数/金钱列上做Sum()这一事实感到惊讶 . 使用DefaultIfEmpty()只是行不通 . :(
我认为在LINQ中要介绍的一件好事就是如何让自己在性能方面遇到麻烦 . 例如,使用LINQ的计数作为循环条件真的非常不聪明 .
延迟执行
我知道延迟执行概念现在应该被打败,但是这个例子确实帮助我实际掌握了它:
上面的代码返回以下内容:
这不仅仅是
LINQ
到SQL
,而且这些功能不仅仅是嵌入在语言中的SQL
解析器 .Big O notation . 如果你没有意识到LINQ,那么在没有意识到的情况下编写O(n ^ 4)算法非常容易 .
我认为
Lambda
表达式可以解析为表达式树和匿名委托这一事实,因此您可以将相同的声明性lambda
表达式传递给IEnumerable<T>
扩展方法和IQueryable<T>
扩展方法 .花了我很长时间才意识到许多LINQ扩展方法,如
Single()
,SingleOrDefault()
等,都有带lambda的重载 .你可以做 :
并且不需要这样说 - 一些糟糕的教程让我养成了做的习惯
在LINQ to SQL中,我经常看到人们不了解DataContext,如何使用它以及如何使用它 . 太多人没有看到DataContext是什么,一个工作单元对象,而不是持久对象 .
我已经看过很多次人们试图单独使用DataContext / session会话而不是为每个操作创造新的时间 .
然后在评估IQueryable之前就已经处理了DataContext,但更多的是人们不了解IQueryable而不是DataContext .
我看到很多混淆的另一个概念是查询语法与表达式语法 . 我将使用哪个是最容易的,通常坚持使用表达式语法 . 很多人还没有意识到他们最终会产生同样的东西,毕竟Query被编译成Expression .
我认为LINQ中被误解的部分是它是一种语言扩展,而不是数据库扩展或构造 .
LINQ
远不止LINQ to SQL
.既然我们大多数人都在收藏品上使用了
LINQ
,我们将永远不会回去!自从2.0中的Generics和3.0中的匿名类型以来,
LINQ
是.NET最重要的特性 .现在我们有了Lambda,我不能等待并行编程!
我肯定想知道我是否需要知道树的表达方式,以及为什么 .
我是LINQ的新手 . 这是我第一次尝试时偶然发现的事情
将多个查询合并为一个
在Visual Studio中有效调试LINQ查询 .
我最初没有意识到的是LINQ语法不需要
IEnumerable<T>
或IQueryable<T>
工作,LINQ只是关于模式匹配 .alt text http://bartdesmet.info/images_wlw/QIsIQueryabletheRightChoiceforMe_13478/image_thumb_3.png
Here is the answer(不,我 didn't 写了那篇博客,巴特德斯梅特做了,他已经找到了) .
我仍然遇到“let”命令(我从来没有找到用途)和SelectMany(我已经使用过,但我不确定我做得对)的问题
了解Linq提供程序中的抽象何时泄漏 . 有些东西可以处理对象而不是SQL(例如.TakeWhile) . 有些方法可以转换为SQL(ToUpper)而其他方法则不能 . 某些技术在其他人在SQL中更有效的对象(不同的连接方法)中更有效 .
几件事 .
人们认为Linq是Linq to SQL .
有些人认为他们可以开始用Linq查询替换所有foreach /逻辑,而不考虑这种性能影响 .
IQueryable同时接受
Expression<Func<T1, T2, T3, ...>>
和Func<T1, T2, T3, ...>
,但没有提到第二种情况下性能下降的提示 .这是代码示例,演示了我的意思:
我不知道它是否有资格被误解 - 但对我而言,仅仅是未知数 .
我很高兴了解DataLoadOptions以及在进行特定查询时如何控制哪些表连接 .
有关详细信息,请参阅此处:MSDN: DataLoadOptions
我会说LINQ中最容易被误解的(或者应该是不可理解的?)方面是 IQueryable 和 custom LINQ providers .
我已经使用LINQ了一段时间,并且在IEnumerable世界中完全感到舒服,并且可以解决LINQ的大多数问题 .
但是当我开始关注IQueryable,以及Expressions和自定义linq提供程序时,它让我头晕目眩 . 如果你想看到一些非常复杂的逻辑,看看LINQ to SQL是如何工作的 .
我期待理解LINQ的那个方面......
正如大多数人所说,我认为最容易被误解的部分是假设LINQ只是T-SQL的替代品 . 我认为自己是TSQL大师的经理不会让我们在项目中使用LINQ,甚至讨厌MS发布这样的东西!
What does var represent when a query is executed?
是
iQueryable
,iSingleResult
,iMultipleResult
,还是根据实施情况而改变 . 关于使用(似乎是什么)动态类型与C#中的标准静态类型有一些猜测 .嵌套循环是多么容易,我不认为每个人都理解 .
例如:
group by
仍然让我头晕目眩 .关于deferred execution的任何混淆都应该能够通过一些简单的基于LINQ的代码并在监视窗口中进行游戏来解决 .
编译查询
事实上,你不能链接
IQueryable
,因为它们是方法调用(虽然仍然只有SQL可翻译!)并且几乎不可能解决它是令人难以置信的并且造成严重违反DRY . 我需要我的IQueryable
's for ad-hoc in which I don'已经编译了查询(我只为重度场景编译了查询),但是在编译查询中我可以在2个地方做同样的子查询,需要记住如果有什么变化就更新两者,等等 . 一个噩梦 .我认为关于LINQ to SQL的#1错误概念是你仍然需要知道SQL以便有效地使用它 .
关于Linq to Sql的另一个误解是你仍然需要将数据库安全性降低到荒谬的程度才能使它工作 .
第三点是使用Linq to Sql和Dynamic类(意味着类定义是在运行时创建的)会导致大量的即时编译 . 这绝对可以扼杀性能 .
延迟加载 .
如前所述,延迟加载和延迟执行
LINQ to Objects和LINQ to XML(IEnumerable)如何与LINQ to SQL(IQueryable)不同
如何在所有层中使用LINQ构建数据访问层,业务层和表示层....这是一个很好的例子 .
正如大多数人所说,我认为最容易被误解的部分是假设LINQ只是T-SQL的替代品 . 我认为自己是TSQL大师的经理不会让我们在项目中使用LINQ,甚至讨厌MS发布这样的东西!
交易(不使用的TransactionScope)