LINQ to SQL有哪些优点?

21

我刚开始在一个中等规模的项目上使用LINQ to SQL,想增加自己对L2S所提供的优势的了解。

我看到的一个缺点是它增加了另一层代码,我理解它比使用存储过程和ADO.Net性能较慢。此外,调试可能是一个挑战,特别是对于更复杂的查询,这些查询最终可能会被移动到存储过程中。

我一直希望能够在更好的开发环境中编写查询,L2S查询是否是我一直在寻找的解决方案?还是我们只是在SQL之上创建了另一层,并且现在需要担心两倍的问题?


1
值得注意的是,这是一个非常复杂的问题。如果列出了缺点,列出优点会更有用。此处所有答案都已经11年过去了,因此请把所有信息都以适当的方式看待。 - Liam
5个回答

41

L2S提供的优势:

  • 没有像SQL查询中那样的魔法字符串
  • 智能感知
  • 当数据库更改时进行编译检查
  • 更快的开发速度
  • 工作单元模式(上下文)
  • 可用于小型项目的自动生成域对象
  • 延迟加载。
  • 学习编写linq查询/lambda表达式是.NET开发人员必须学习的技能。

关于性能:

  • 在大多数解决方案中,性能很可能不会成为问题。预先优化是一种反模式。如果您后来发现应用程序某些区域速度太慢,您可以分析这些部分,并在某些情况下甚至将一些linq查询与存储过程或ADO.NET交换。
  • 在许多情况下,延迟加载功能可以加快性能,或者至少极大地简化代码。

关于调试:

  • 在我看来,与存储过程和ADO.NET相比,调试Linq2Sql要容易得多。我建议您查看Linq2Sql Debug Visualizer,它可以让您在调试时查看查询,并甚至触发执行以查看结果。
  • 您还可以配置上下文将所有SQL查询写入控制台窗口,更多信息此处

关于另一层:

  • Linq2Sql可以被视为另一层,但它是一个纯数据访问层。存储过程也是代码的另一层,我见过很多情况下业务逻辑的一部分已经实现在存储过程中。在我看来,这样做更糟糕,因为您将业务层拆分成两个位置,开发人员将更难以清晰地了解业务领域。

14

只是一些快速的想法。

LINQ总体而言

  • 使用相同的语法和操作查询内存集合和外部数据存储
  • 声明式风格对于查询非常有效-在许多情况下,读写都更容易
  • 整洁的语言集成允许编写新的提供程序(包括进程内和进程外)并利用相同的查询表达式语法

LINQ到SQL(或其他数据库LINQ)

  • 在需要时编写查询,而不是作为存储过程,可以使开发速度更快:只需执行少量步骤即可获得所需数据
  • 涉及较少字符串(存储过程、参数名称或纯SQL),其中拼写错误可能会很烦人;另一方面,你可以为查询启用智能提示
  • 除非你要使用来自ADO.NET的“原始”数据,否则你将在任何地方都有一个对象模型。为什么不让LINQ to SQL为你处理?我很喜欢只需执行查询并获取返回的准备好使用的对象。
  • 我希望性能正常——如果不正常,你可以自己进行调整或回退到直接使用SQL。使用ORM并不能消除创建正确索引的需要,通常应检查非平凡查询所生成的SQL。

这绝不是万能药,但我远比直接进行SQL查询或使用存储过程喜欢它。


约翰和本特基本上说了同样的话,都有很好的细节! - John Baughman
最好的做法可能是在数据库存储过程中实现业务逻辑(以利用数据库的安全性能和性能分析能力),并仅使用LINQ来减少编码,同时用于从SP抓取数据填充对象。 - Faiz
1
@Faiz:另一方面,与 SQL 相比,在 C# 中实现业务逻辑通常要简单得多,如果您只有一个访问数据的途径(例如,数据库前面有一个层次清晰的 Web 服务),那么您可以兼顾两者的优点。 - Jon Skeet
刚刚看到了SQL Debug Visualizer。看起来如果我们要在LINQ中编写逻辑,我们必须先去检查SQL的样子,并修改LINQ代码,使相应的SQL看起来更有效率。在我看来,这将消耗你节省下来的所有时间,而不是编写老式的ORM代码。 - Faiz
1
@Faiz:如果你不喜欢它,可以不用理会。我会继续喜欢它 :) - Jon Skeet

1

我必须说它们是你一直在寻找的东西。需要一些时间去适应,但一旦你适应了,就不能想着回去了(至少对于我来说是这样)。

关于linq与存储过程的比较,如果你构建不当,两者都可能性能不佳。我将一个客户端的一些糟糕编码的存储过程转换成linq to sql,所需时间从20秒(对于Web应用程序完全不可接受)减少到小于1秒,并且代码量比存储过程的解决方案少得多。

更新1:此外,您可以获得很多灵活性,因为您可以限制获取的列,实际上只会检索该列。在存储过程的解决方案中,您必须为获取的每个列集定义一个存储过程,即使底层查询相同。


1

-2
我们最近将开发环境从Entity Framework转移到了LINQ2Entity。以前,我们使用基本的SQL适配器。由于我们正在处理的数据库相对较小,因此我无法评论LINQ的性能。
不过,我必须承认,现在编写查询变得更加容易了,而且增加实体也使强类型化成为可能。

Johannes,我认为强类型不是linq2entity与linq2sql的争论点,因为它们都有强类型 :) ... 我相信有一些好的观点,但我只限于比较linq2sql和ado.net。 - eglasius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接