【发布时间】:2010-04-21 17:05:50
【问题描述】:
linq 一般有什么缺点。
【问题讨论】:
标签: linq
linq 一般有什么缺点。
【问题讨论】:
标签: linq
我仍然非常喜欢 LINQ :)
编辑:写完这份短名单后,我记得我已经得到了a very similar question的答案...
【讨论】:
LINQ 最大的痛点是(使用数据库后端)如果没有 leaky abstraction,您将无法在存储库接口上使用它。
LINQ 非常棒在一个层(尤其是 DAL 等),但由于不同的提供者支持不同的东西,你不能依赖 Expression<Func<...>> 或 IQueryable<T> 功能对不同的工作相同实现。
例如,在 LINQ-to-SQL 和实体框架之间:
Single()
Skip/Take/First 没有明确的 OrderBy,EF 会出错
等等。 ADO.NET 数据服务的 LINQ 提供程序支持不同的组合。这使得模拟和其他抽象变得不安全。
但是:对于内存中(LINQ-to-Objects),或在单层/实现中......太棒了。
这里有更多想法:Pragmatic LINQ。
【讨论】:
就像编程中的任何抽象一样,它很容易受到误解:“如果我只了解这种抽象,我就不需要了解幕后发生的事情。”
事实是,如果您确实了解幕后发生的事情,您将从抽象中获得更好的价值,因为您将了解它不再适用的地方,因此您将能够应用它在适当的时候对成功有更大的信心。
这适用于所有抽象,并且适用于大桶中的 Linq。要了解Linq to Objects,最好的办法是学习如何用yield return在C#中编写Select、Where、Aggregate等。然后弄清楚yield return 是如何通过全部用类编写来替换大量手写代码的。然后,您将能够在欣赏它为您节省的精力的情况下使用它,并且它不再看起来像魔术,因此您将了解其局限性。
对于 Linq 的变体也是如此,其中谓词被捕获为表达式并传输到另一个环境以执行。您必须了解它的工作原理才能安全地使用它。
所以 Linq 的第 1 个缺点是:简单的例子看起来很短很简单。问题是,样本的作者怎么知道要写什么?因为他们知道如何将其全部写成长格式,并且他们知道如何将 Linq 的片段用作缩写,所以他们得出了漂亮的短版本。
正如我所说,并不是真正特定于 Linq,但无论如何都与它高度相关。
【讨论】:
匿名类型。正确的 ORM 应该总是返回“你的”类型的对象(部分类,可以添加我的方法,覆盖等)。有很多教程和使用 linq 的不同复杂查询的示例,但它们都不关心解释返回“属性包”(return new { .........} )的优势。我应该如何使用匿名类型,再次将其包装在另一个类中?
【讨论】:
其实我想不出有什么缺点。它使编程生活变得更加简单,因为很多东西可以用更紧凑但可读性更好的方式编写。
但话虽如此,我也必须同意 Jon 的观点,即你应该知道你在做什么(但这适用于所有技术进步)。
【讨论】:
它唯一的缺点是它的性能见article
【讨论】: