当前位置:  开发笔记 > 编程语言 > 正文

LINQ中最难或最容易被误解的方面是什么?

如何解决《LINQ中最难或最容易被误解的方面是什么?》经验,为你挑选了23个好方法。

背景:在接下来的一个月里,我将进行三次谈话,或者至少包括LINQ在上下文中C#.我想知道哪些主题值得给予相当多的关注,基于人们可能会发现难以理解的内容,或者他们可能会错误地认为什么.我不会特别谈论LINQSQL或实体框架除了作为如何查询可以远程使用表达式树(通常被执行的例子IQueryable).

那么,你发现了LINQ什么?你在误解方面看到了什么?示例可能是以下任何一种,但请不要限制自己!

C#编译器如何处理查询表达式

Lambda表达式

表达树

扩展方法

匿名类型

IQueryable

延期与立即执行

流式传输与缓冲执行(例如,OrderBy延迟但缓冲)

隐式输入的局部变量

阅读复杂的通用签名(例如Enumerable.Join)

JaredPar.. 271

延迟执行



1> JaredPar..:

延迟执行


同意ALassek.MSDN文档清楚地说明了LINQ的惰性评估性质.也许真正的问题是开发人员的懒惰编程本质... =)
Righto - 这显然是读者的最爱,这是这个问题最重要的事情.我还将"缓冲与流媒体"添加到混音中,因为这是密切相关的 - 并且通常不会像我希望在书中看到的那样详细讨论.
真?在学习Linq的过程中,我曾经多次向我指出这种懒惰的性质,这对我来说从来都不是问题.
知道yield语句是什么以及它如何工作是恕我直言,对于彻底理解LINQ至关重要.
...尤其是当你意识到它适用于LINQ to objects而不仅仅是LINQ 2 SQL时 - 你看到10个web方法调用来检索项目列表,当你已经通过相同的项目列表进行枚举时你认为列表已经过评估

2> DSO..:

我知道延迟执行概念现在应该被打败,但是这个例子确实帮助我实际掌握了它:

static void Linq_Deferred_Execution_Demo()
{
    List items = 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


http://blogs.msdn.com/b/charlie/archive/2007/12/09/deferred-execution.aspx < - 我认为这是我认为最好的博客解释.(远在2007年,不敢相信它已经存在很久了)

3> smaclell..:

这不仅仅是LINQ为了SQL而且这些功能不仅仅是SQL嵌入在语言中的解析器.


不是每个人都这样 我仍然不知道LINQ to SQL是什么,我使用LINQ所有该死的时间.
同意,很多人似乎并不明白LINQ是一个通用的工具.
我厌倦了每个人的想法:/
当我尝试使用LINQ解释一些东西时,我非常生气,而另一个人只是看着我说"哦,我不使用LINQ做类似的事情,只有SQL":(

4> erikkallen..:

大O符号.如果您不知道自己在做什么,LINQ可以非常容易地编写O(n ^ 4)算法,而无需实现它.


一个例子怎么样?
那不是O(n ^ x),那就是O(xn),它只是O(n).
谁能澄清一下这个?
就一个例子而言,也许他的意思是,很容易让Select子句包含许多Sum()运算符,每个运算符都会导致整个记录集的另一次传递.
尝试在没有连接运算符的情况下进行连接将导致O(n ^ x):来自范围1中的i1,范围2中的i2,范围3中的i3,范围4中的i4,其中i1 == i2 && i3 == i4选择新{i1, i2,i3,i4}.而且我之前看过这个.它工作,但非常缓慢.

5> Tim Jarvis..:

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


同意.我是一名资深人士,我刚刚意识到这种隐式转换是在我开始编写自己的QueryProvider时发生的

6> Simon_Weaver..:

把我的方式很长时间才意识到,很多LINQ扩展方法,如Single(),SingleOrDefault()等有需要lambda表达式重载.

你可以做 :

Single(x => x.id == id)

并且不需要这样说 - 一些糟糕的教程让我养成了做的习惯

Where(x => x.id == id).Single()


听起来可能很奇怪,但我更喜欢第二种语法.我发现它更具可读性.
我也一直忘记这一点."Count()"等也是如此.除了明显的代码可读性之外,你知道是否有任何性能差异吗?

7> Aaron Powell..:

在LINQ to SQL中,我经常看到人们不了解DataContext,如何使用它以及如何使用它.太多人没有看到DataContext是什么,一个工作单元对象,而不是持久对象.

我已经看过很多次人们试图单独使用DataContext/session会话而不是为每个操作创造新的时间.

然后在评估IQueryable之前就已经处理了DataContext,但更多的是人们不了解IQueryable而不是DataContext.

我看到很多混淆的另一个概念是查询语法与表达式语法.我将使用哪个是最容易的,通常坚持使用表达式语法.很多人还没有意识到他们最终会产生同样的东西,毕竟Query被编译成Expression.


您不应该在单例中使用DataContext,它不是线程安全的.
@Slace,并非所有程序都是多头的,因此可以在许多"桌面"软件中将DataContext作为单例
警告:工作单元可以是一个小程序,数据上下文为单例.
当我完成第一个LINQ to SQL项目时,我被这个(使用DataContext作为单例)所困扰.我不认为文档和书籍使这个显而易见.实际上,我认为名称可以改进,但我不确定如何.

8> Chris..:

我想 LINQ的误解的部分是,它是一种语言的扩展,而不是一个数据库扩展或构建.

LINQ不仅仅是LINQ to SQL.

既然我们大多数人都使用LINQ过收藏品,我们永远不会回去!

LINQ 自从2.0中的Generics和3.0中的匿名类型以来,.NET是.NET最重要的特性.

现在我们有了Lambda,我不能等待并行编程!



9> Robert Rossn..:

我肯定想知道我是否需要知道树的表达方式,以及为什么.


我认为值得知道表达树是什么以及它们存在的原因,但不知道如何自己构建它们的细节.(他们很难手工构建,但编译器在转换lambda表达式时会做得很好.)
实际上,我正在考虑在表达式树上做一些博客条目(因为我"得到"它们).我发现操纵表达树非常有用......
我只是担心表达树会像屈服声明一样:尽管事实上我一开始并不理解它的含义,但结果却非常有价值.

10> Mark Heath..:

我是LINQ的新手.这是我第一次尝试时偶然发现的事情

将多个查询合并为一个

在Visual Studio中有效地调试LINQ查询.


调试LINQ本身就是一个主题,也是一个重要的主题.我认为LINQ的最大弱点在于它可以让你编写一些你无法通过的任意复杂逻辑块.
这些可能是使用LINQ pad的好地方
同意; 这就是为什么我写的[LINQ Secrets Revealed:Chaining and Debugging](http://www.simple-talk.com/dotnet/.net-framework/linq-secrets-revealed-chaining-and-debugging/),刚刚发表于Simple-Talk.com,您可以找到帮助.

11> Aaron Powell..:

我最初没有意识到的是,在LINQ语法的东西并不需要IEnumerableIQueryable工作,LINQ是只是模式匹配.

alt text http://bartdesmet.info/images_wlw/QIsIQueryabletheRightChoiceforMe_13478/image_thumb_3.png

这是答案(不,我没有写那篇博客,Bart De Smet做过,而且他是我发现的LINQ上最好的博客之一).



12> James Curran..:

我仍然遇到"let"命令(我从来没有找到用途)和SelectMany(我已经使用过,但我不确定我做得对)的问题


每当你想要引入变量时,你都会使用let语句.想象一下传统的循环,你在其中引入变量并给每个变量一个名称以帮助代码的可读性.有时候,如果你有一个let语句来评估一个函数结果,你可以选择并按顺序排序,而不必评估结果两次.

13> denis philli..:

了解Linq提供程序中的抽象何时泄漏.有些东西可以处理对象而不是SQL(例如.TakeWhile).有些方法可以转换为SQL(ToUpper)而其他方法则不能.某些技术在其他人在SQL中更有效的对象(不同的连接方法)中更有效.



14> Krishna Kuma..:

几件事.

    人们认为Linq是Linq to SQL.

    有些人认为他们可以开始用Linq查询替换所有foreach /逻辑,而不考虑这种性能影响.



15> Marc Gravell..:

好的,由于需求,我已经写了一些Expression的东西.我对博主和LiveWriter如何密谋对其进行格式化并不是百分之百的满意,但它现在会做...

无论如何,这里...我喜欢任何反馈,特别是如果有人想要更多信息的领域.

在这里,就像它或恨它...



16> Per Erik Ste..:

一些错误消息,尤其是从LINQ到SQL的错误消息可能会令人困惑.微笑

我和其他人一样被延迟执行了几次.我认为对我来说最令人困惑的是SQL Server查询提供程序以及您可以做什么和不能用它做什么.

我仍然对你不能在有时为空的小数/金钱列上做Sum()这一事实感到惊讶.使用DefaultIfEmpty()只是行不通.:(



17> Steve..:

我认为在LINQ中要介绍的一件好事就是如何让自己在性能方面遇到麻烦.例如,使用LINQ的计数作为循环条件真的非常不聪明.



18> Valera Kolup..:

IQueryable接受了两者,Expression>并且Func没有在第二种情况下提示性能下降.

这是代码示例,演示了我的意思:

[TestMethod]
public void QueryComplexityTest()
{
    var users = _dataContext.Users;

    Func                funcSelector =       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);
}



19> Martin..:

我不知道它是否有资格被误解 - 但对我而言,仅仅是未知数.

我很高兴了解DataLoadOptions以及在进行特定查询时如何控制哪些表连接.

有关详细信息,请参阅此处:MSDN:DataLoadOptions



20> Jack Ukleja..:

我会说LINQ中最容易被误解的(或者应该是不可理解的?)方面是IQueryable自定义LINQ提供程序.

我已经使用LINQ了一段时间,并且在IEnumerable世界中完全感到舒服,并且可以解决LINQ的大多数问题.

但是当我开始关注IQueryable,以及Expressions和自定义linq提供程序时,它让我头晕目眩.如果你想看到一些非常复杂的逻辑,看看LINQ to SQL是如何工作的.

我期待理解LINQ的那个方面......



21> HashName..:

正如大多数人所说,我认为最容易被误解的部分是假设LINQ只是T-SQL的替代品.我认为自己是TSQL大师的经理不会让我们在项目中使用LINQ,甚至讨厌MS发布这样的东西!



22> 小智..:

var在执行查询时表示什么?

难道iQueryable,iSingleResult,iMultipleResult,或者它改变基础上实施.关于使用(似乎是什么)动态类型与C#中的标准静态类型有一些猜测.



23> Rob Packwood..:

嵌套循环是多么容易,我不认为每个人都理解.

例如:

from outerloopitem in outerloopitems
from innerloopitem in outerloopitem.childitems
select outerloopitem, innerloopitem

推荐阅读
雨天是最美
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有