背景:在接下来的一个月里,我将进行三次谈话,或者至少包括LINQ
在上下文中C#
.我想知道哪些主题值得给予相当多的关注,基于人们可能会发现难以理解的内容,或者他们可能会错误地认为什么.我不会特别谈论LINQ
到SQL
或实体框架除了作为如何查询可以远程使用表达式树(通常被执行的例子IQueryable
).
那么,你发现了LINQ
什么?你在误解方面看到了什么?示例可能是以下任何一种,但请不要限制自己!
C#
编译器如何处理查询表达式
Lambda表达式
表达树
扩展方法
匿名类型
IQueryable
延期与立即执行
流式传输与缓冲执行(例如,OrderBy延迟但缓冲)
隐式输入的局部变量
阅读复杂的通用签名(例如Enumerable.Join)
JaredPar.. 271
延迟执行
延迟执行
我知道延迟执行概念现在应该被打败,但是这个例子确实帮助我实际掌握了它:
static void Linq_Deferred_Execution_Demo() { Listitems = new List { "Bob", "Alice", "Trent" }; var results = from s in items select s; Console.WriteLine("Before add:"); foreach (var result in results) { Console.WriteLine(result); } items.Add("Mallory"); // // Enumerating the results again will return the new item, even // though we did not re-assign the Linq expression to it! // Console.WriteLine("\nAfter add:"); foreach (var result in results) { Console.WriteLine(result); } }
上面的代码返回以下内容:
Before add: Bob Alice Trent After add: Bob Alice Trent Mallory
这不仅仅是LINQ
为了SQL
而且这些功能不仅仅是SQL
嵌入在语言中的解析器.
大O符号.如果您不知道自己在做什么,LINQ可以非常容易地编写O(n ^ 4)算法,而无需实现它.
我认为Lambda
表达式可以解析为表达式树和匿名委托这一事实,因此您可以将相同的声明性lambda
表达式传递给IEnumerable
扩展方法和IQueryable
扩展方法.
把我的方式很长时间才意识到,很多LINQ扩展方法,如Single()
,SingleOrDefault()
等有需要lambda表达式重载.
你可以做 :
Single(x => x.id == id)
并且不需要这样说 - 一些糟糕的教程让我养成了做的习惯
Where(x => x.id == id).Single()
在LINQ to SQL中,我经常看到人们不了解DataContext,如何使用它以及如何使用它.太多人没有看到DataContext是什么,一个工作单元对象,而不是持久对象.
我已经看过很多次人们试图单独使用DataContext/session会话而不是为每个操作创造新的时间.
然后在评估IQueryable之前就已经处理了DataContext,但更多的是人们不了解IQueryable而不是DataContext.
我看到很多混淆的另一个概念是查询语法与表达式语法.我将使用哪个是最容易的,通常坚持使用表达式语法.很多人还没有意识到他们最终会产生同样的东西,毕竟Query被编译成Expression.
我想在 LINQ的误解的部分是,它是一种语言的扩展,而不是一个数据库扩展或构建.
LINQ
不仅仅是LINQ to SQL
.
既然我们大多数人都使用LINQ
过收藏品,我们永远不会回去!
LINQ
自从2.0中的Generics和3.0中的匿名类型以来,.NET是.NET最重要的特性.
现在我们有了Lambda,我不能等待并行编程!
我肯定想知道我是否需要知道树的表达方式,以及为什么.
我是LINQ的新手.这是我第一次尝试时偶然发现的事情
将多个查询合并为一个
在Visual Studio中有效地调试LINQ查询.
我最初没有意识到的是,在LINQ语法的东西并不需要IEnumerable
或IQueryable
工作,LINQ是只是模式匹配.
alt text http://bartdesmet.info/images_wlw/QIsIQueryabletheRightChoiceforMe_13478/image_thumb_3.png
这是答案(不,我没有写那篇博客,Bart De Smet做过,而且他是我发现的LINQ上最好的博客之一).
我仍然遇到"let"命令(我从来没有找到用途)和SelectMany(我已经使用过,但我不确定我做得对)的问题
了解Linq提供程序中的抽象何时泄漏.有些东西可以处理对象而不是SQL(例如.TakeWhile).有些方法可以转换为SQL(ToUpper)而其他方法则不能.某些技术在其他人在SQL中更有效的对象(不同的连接方法)中更有效.
几件事.
人们认为Linq是Linq to SQL.
有些人认为他们可以开始用Linq查询替换所有foreach /逻辑,而不考虑这种性能影响.
好的,由于需求,我已经写了一些Expression的东西.我对博主和LiveWriter如何密谋对其进行格式化并不是百分之百的满意,但它现在会做...
无论如何,这里...我喜欢任何反馈,特别是如果有人想要更多信息的领域.
在这里,就像它或恨它...
一些错误消息,尤其是从LINQ到SQL的错误消息可能会令人困惑.微笑
我和其他人一样被延迟执行了几次.我认为对我来说最令人困惑的是SQL Server查询提供程序以及您可以做什么和不能用它做什么.
我仍然对你不能在有时为空的小数/金钱列上做Sum()这一事实感到惊讶.使用DefaultIfEmpty()只是行不通.:(
我认为在LINQ中要介绍的一件好事就是如何让自己在性能方面遇到麻烦.例如,使用LINQ的计数作为循环条件真的非常不聪明.
IQueryable接受了两者,Expression
并且Func
没有在第二种情况下提示性能下降.
这是代码示例,演示了我的意思:
[TestMethod] public void QueryComplexityTest() { var users = _dataContext.Users; FuncfuncSelector = q => q.UserName.StartsWith("Test"); Expression > expressionSelector = q => q.UserName.StartsWith("Test"); // Returns IEnumerable, and do filtering of data on client-side IQueryable func = users.Where(funcSelector).AsQueryable(); // Returns IQuerible and do filtering of data on server side // SELECT ... FROM [dbo].[User] AS [t0] WHERE [t0].[user_name] LIKE @p0 IQueryable exp = users.Where(expressionSelector); }
我不知道它是否有资格被误解 - 但对我而言,仅仅是未知数.
我很高兴了解DataLoadOptions以及在进行特定查询时如何控制哪些表连接.
有关详细信息,请参阅此处:MSDN:DataLoadOptions
我会说LINQ中最容易被误解的(或者应该是不可理解的?)方面是IQueryable和自定义LINQ提供程序.
我已经使用LINQ了一段时间,并且在IEnumerable世界中完全感到舒服,并且可以解决LINQ的大多数问题.
但是当我开始关注IQueryable,以及Expressions和自定义linq提供程序时,它让我头晕目眩.如果你想看到一些非常复杂的逻辑,看看LINQ to SQL是如何工作的.
我期待理解LINQ的那个方面......
正如大多数人所说,我认为最容易被误解的部分是假设LINQ只是T-SQL的替代品.我认为自己是TSQL大师的经理不会让我们在项目中使用LINQ,甚至讨厌MS发布这样的东西!
var在执行查询时表示什么?
难道iQueryable
,iSingleResult
,iMultipleResult
,或者它改变基础上实施.关于使用(似乎是什么)动态类型与C#中的标准静态类型有一些猜测.
嵌套循环是多么容易,我不认为每个人都理解.
例如:
from outerloopitem in outerloopitems from innerloopitem in outerloopitem.childitems select outerloopitem, innerloopitem