在开始使用LINQ时,人们犯的最大错误是什么?

时间:2009-04-22 14:09:37

标签: .net linq

人们在第一次使用LINQ时遇到的根本误解是什么?

例如,他们认为当它真的是别的时候它是一回事吗?

并且,是否有一些最佳实践来避免这些错误?

15 个答案:

答案 0 :(得分:90)

它应该用于所有事情。

答案 1 :(得分:26)

未能理解(或存在!)之间的差异:

.First()
.FirstOrDefault()
.Single()
.SingleOrDefault()

不理解deferred execution

答案 2 :(得分:22)

它只引用LINQ to SQL

答案 3 :(得分:16)

人们在使用LINQ时犯的最大错误与人们尝试使用任何一种技术相同,而这些技术都是基于他们没有任何良好基础的技术。

如果你无法理解正确/高效的数据库查询,你将搞砸LINQ。

如果你无法理解ADO.NET和数据访问的基本原理,你可能会搞砸了。

人们认为通过使用LINQ,它将允许它们沿用,但它不会。

答案 4 :(得分:6)

我在LINQ to SQL中看到的一个基本问题是不理解 DataContext 。它是一个工作单元对象,应该为每个工作单元重新创建。

答案 5 :(得分:5)

想到的事情是

  • 一定要慢一点,最好用普通的C#
  • 尝试在简单的C#更易读/可管理的地方使用它

答案 6 :(得分:3)

可能人们可能会误解的一个问题是编写LINQ查询的方式,尤其是LINQ2SQL,对性能没有影响。一个人应该总是知道在后台发生了什么,如果有人打算编写具有高性能的代码,否则你可能最终会遇到有趣的超时,OOMexceptions,堆栈溢出等...... =)

答案 7 :(得分:3)

答案 8 :(得分:2)

LINQ作为一种语言非常简单,并不是那么出乎意料,特别是如果你熟悉函数式编程。

Deferred Execution的概念可能是最大的问题,也是最好的功能之一。当您使用返回IQueryable的LINQ时,重要的是要记住您不执行您刚编写的任何代码。直到你调用其中一个产生查询的其他结果的方法。

此外,就LINQ to SQL提供程序而言,我发现的最大问题是performance cost。事实证明,除非您预先编译高度流量的查询,否则构建每次运行LINQ查询时产生的SQL查询都会产生大量的CPU成本。

答案 9 :(得分:2)

我完全同意亚当·罗宾逊的说法,事实上,在影响或建筑观点方面,人们对美容语法不再深入研究技术事实。

有时候人们会认为它是一件事,当它真的是另一回事时......重要的是要注意Linq是一种“技术”并且可以通过多种方式实现,每种方式都可能以不同的方式影响性能和设计(例如),基本语法保持不变,但基础内容可能会发生变化。

实际上,从伟大且不断增长的实施开始,没有完整的最佳实践列表,最佳实践可以从以下开始:

  1. 了解将使用何种实现(Linq2Sql,Linq2Objects,Linq2CSV,Linq2Excel,Linq2LDAP,Linq2JSON,Linq2Xml,Linq2Xsd等)
  2. 然后尝试了解所选择的实现中的基本技术功能

答案 10 :(得分:2)

对自己说,了解序列何时被缓冲或流式传输非常重要。

使用大量数据填充缓冲区会占用大量内存。如果可能,一旦数据减少,应该进行反转,计数,排序等操作。在连接中,左侧序列是流式传输的,右侧是缓冲的。如果尺寸存在显着差异,请将较小的尺寸放在右侧。

答案 11 :(得分:1)

在没有主键的表上使用linq2sql(而不是在设计器中定义一个)。

特别是如果他们正在做的是更新,它不会更新任何内容,也不会出现错误。

答案 12 :(得分:1)

很多人认为LINQ是他们可以在Code中使用的'Magical SQL'。它看起来像SQL,但它完全不同。了解它的差异以及真正做的事情将会阻止很多挫折。

答案 13 :(得分:0)

我认为理解查询执行的重点往往是一个错误(即认为它是在查询点,而不是在数据被首次访问的那一点),以及只是因为它编译它正在进行的信念跑。

这是对Linq to SQL的引用。

Joe Albahari为Linq提供了一个很棒的工具LinqPad,让我能够更快地学习Linq。如果你没有它,那就去吧!我甚至没有收取佣金;)

答案 14 :(得分:0)

了解从Linq2SQL / Entities到Linq2Objects的位置。了解数据库引擎与应用程序中的内容和未执行内容。知道何时使用内存中对象与您正在使用的基础Linq提供程序,然后知道如何在需要执行查询后处理时有意地从Linq2SQL转换到Linq2Object,从而利用您不支持的C#/ .NET函数提供商。