LINQ到SQL VS存储过程? [关闭] LINQ到SQL VS存储过程? [关闭](LIN

2019-05-04 13:52发布

我看了看StackOverflow上(以下简称“新手指南LINQ”的帖子在这里初学者指南LINQ ),但有一个后续问题:

我们即将斜了一个新的项目中,我们几乎所有的数据库运算的将是相当简单的数据检索的(有这已经写入数据项目的另一部分)。 我们的大多数其他项目了这一点利用了这样的事情存储过程。 不过,我想利用LINQ到SQL如果它更有意义。

所以,问题是这样的:对于简单的数据检索,该方法更好,LINQ到SQL或存储的特效? 任何特定亲的还是反对的?

谢谢。

Answer 1:

LINQ超过存储过程的一些优点:

  1. 类型安全性 :我想大家都明白这一点。
  2. 抽象 :这是特别真实与LINQ到实体 。 这种抽象也允许框架添加额外的改进,你可以很容易乘虚而入。 PLINQ是LINQ添加多线程支持的一个例子。 代码更改最少添加此支持。 这将是更难做,只是简单地调用存储过程这个数据访问代码。
  3. 调试支持 :我可以用任何.NET调试器来调试查询。 有了存储过程,你不能轻易调试SQL和经验在很大程度上依赖于数据库供应商(MS SQL Server提供了一个查询分析器,但往往是不够的)。
  4. 供应商无关 :LINQ的作品有很多的数据库和支持数据库的数量只会增加。 存储过程并不总是数据库,或者是因为不同的语法或特性支持之间移植的(如果数据库支持存储过程的话)。
  5. 部署 :其他人已经提到这一点,但它更容易部署单个组件,而不是部署一组存储过程的。 这也与4号绑英寸
  6. 简单 :你不必学习T-SQL进行数据访问,也不是你要学会必要的数据访问API(如ADO.NET)调用存储过程的。 这是关系到#3,#4。

LINQ的一些缺点VS存储过程:

  1. 网络流量 :存储过程只需要存储过程序列名和参数数据通过有线而LINQ发送整个查询。 这可以得到非常糟糕,如果查询是非常复杂的。 然而,LINQ的抽象允许微软将随着时间的推移改善这一点。
  2. 不灵活 :存储过程可以利用数据库的功能集的充分利用。 LINQ往往是在它的支持更通用。 这是常见于任何一种语言的抽象(如C#与汇编语言)的。
  3. 重新编译 :如果您需要更改你的数据访问的方式,你需要重新编译版本,并重新部署组装。 存储过程有时可以允许DBA来调整数据访问程序,而无需重新部署任何东西。

安全性和可管理性是人们争论过的东西。

  1. 安全性 :例如,您可以通过限制直接表保护敏感数据,并把访问控制列表的存储过程。 随着LINQ,但是,你仍然可以限制对表的直接访问,而是把对ACL的更新表视图来实现类似的结束(假设你的数据库支持可更新视图)。
  2. 可管理性 :使用视图还为您提供了屏蔽从架构更改应用程序的非破碎(如表正常化)的优势。 您可以更新,而不需要您的数据访问代码更改视图。

我曾经是一个大的存储过程的人,但我开始对LINQ稀薄,一般一个更好的选择。 如果有一些地方的存储过程显然更好,那么我可能会写还是一个存储过程,但使用LINQ访问它。 :)



Answer 2:

我一般把一切在存储过程中,所有的数据库管理员已经唠叨了多年的原因的支持者。 在LINQ的情况下,这是事实,会有简单的CRUD查询没有性能上的差异。

但做出这个决定时,记住几件事情:使用任何ORM夫妇紧紧您对您的数据模型。 一个DBA没有自由更改数据模型不强迫你改变你的编译代码。 使用存储过程,你可以隐藏这些各种各样的变化在一定程度上,因为参数列表和结果集(S)从过程返回代表它的合同,内脏可以四处改变,只是,只要该合同仍满足。

还有,如果LINQ的用于更复杂的查询,调优数据库变得更加艰巨的任务。 当存储过程运行速度慢,DBA可以完全专注于单独的代码,并且有很多的选择,只是让合同还满意时,他/她就完成了。

我见过很多,很多情况下,在应用程序中的严重问题被更改架构和存储过程的代码没有任何改变部署,编译代码解决。

也许HYBIRD办法将是不错的LINQ? LINQ可以,当然,被用来调用存储过程。



Answer 3:

LINQ to SQL的。

SQL Server将缓存查询计划,所以有对存储过程没有性能增益。

你的LINQ语句,而另一方面,将成为逻辑上一部分,并与您的应用程序进行测试。 存储过程总是有点分离,较难维护和测试。

如果我是工作在一个新的应用程序从零开始,现在我只想用LINQ中,没有存储过程。



Answer 4:

对于基本数据检索我会去对LINQ毫不犹豫。

自从搬到LINQ的我发现了以下优点:

  1. 调试我DAL从未如此简单。
  2. 编译时的安全,当你的模式更改是无价的。
  3. 因为一切都被编译成DLL的部署更加容易。 没有更多的管理部署脚本。
  4. 由于LINQ的可以支持查询任何实现了IQueryable的界面,你将能够使用相同的语法来查询XML,对象和其他数据源,而无需学习新的语法


Answer 5:

LINQ做会增大过程缓存

如果应用程序使用LINQ to SQL和查询涉及使用字符串,可以是长度高度可变,但SQL Server过程高速缓存会变得臃肿与查询的一个版本,每一个可能的字符串长度。 例如,考虑对中的AdventureWorks2008数据库中的表Person.AddressTypes创建了以下非常简单的查询:

var p = 
    from n in x.AddressTypes 
    where n.Name == "Billing" 
    select n;

var p = 
    from n in x.AddressTypes 
    where n.Name == "Main Office" 
    select n;

如果这两个查询的运行,我们将看到在SQL Server过程高速缓存两个项目:一是与一个nvarchar(7),和其他与一个nvarchar(11)的约束。 现在想象一下,如果有成百上千个不同的输入字符串,都具有不同的长度。 过程高速缓存将成为不必要充满了各种对完全相同的查询不同的计划。

这里更多: https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=363290



Answer 6:

我想亲LINQ说法似乎从没有与数据库开发(一般),历史谁也有人来。

特别是,如果使用类似VS DB Pro或团队套件产品,很多在这里所提出的论点并不适用,比如:

难以维护和测试:VS提供了完整的语法检查,风格的检查,参照和约束检查等等。 它也提供完整的单元测试能力和重构工具。

LINQ使不可能的,因为(在我心中)真正的单元测试失败ACID测试。

在调试LINQ是比较容易:为什么呢? VS允许从托管代码和SP的定期调试整步项。

编译成一个DLL,而不是部署脚本:再次,VS就派上用场了它可以构建和部署全数据库或使数据安全的增量变化。

不必学习TSQL与LINQ:不,你不这样做,但你必须学会​​LINQ - 哪来的利益?

我真的不认为这是一个好处。 能够改变孤立的东西听起来在理论上很好,但只是因为改变履行合同并不意味着它返回正确的结果。 为了能够确定正确的结果是什么,你需要的上下文,你会得到从调用代码这方面。

嗯,松散耦合的应用都是很好的程序员的终极目标,因为他们确实提高了灵活性。 能够改变孤立的东西是太棒了,这是你的单元测试,以确保它仍然返回相应的结果。

之前大家都生气,我认为LINQ有它的地方,有一个宏伟的未来。 但是对于复杂的,数据密集型应用程序,我不认为这是准备采取的存储过程的地方。 这是我所用MVP在TechEd今年呼应(他们将继续无名)的图。

编辑:的LINQ to SQL存储的东西过程侧是我还需要更多的 - 这取决于我发现我可以改变我的上述谩骂;)



Answer 7:

LINQ是新的,有它的地方。 LINQ是不是用来代替存储过程。

在这里,我会关注一些业绩神话和缺点,只为“LINQ to SQL的”,当然我可能是完全错误的;-)

(1)人们说LINQ statment可以在SQL Server“缓存”,因此它不会失去效能。 部分真实。 “LINQ to SQL的”,实际上是运行时转换LINQ语法TSQL statment。 因此,从性能的角度来看,一个硬编码ADO.NET SQL语句没有比LINQ差异。

(2)给定的例子中,客户服务UI具有“帐户转移”功能。 这个功能本身可能会更新10个DB表和一次性返回一些信息。 随着LINQ,你必须建立一组语句并将它们作为一个批处理到SQL Server。 这个翻译LINQ-> TSQL批次的性能几乎不能匹配存储过程。 原因? 因为你可以使用内置的SQL事件探查器和执行计划工具调整在存储procedue声明的最小单位,你不能在LINQ做到这一点。

问题的关键是,谈论单一数据库表和小数据集CRUD的时候,LINQ是一样快的SP。 但对于更复杂的逻辑,存储过程是更多的性能tweakable。

(3)“LINQ到SQL”容易使新手引入性能猪。 任何高级TSQL的人可以告诉你什么时候不使用CURSOR(基本上,你不应该在大多数情况下使用光标TSQL)。 随着LINQ与查询迷人的“foreach”循环,这是很容易的新手来写这样的代码:

foreach(Customer c in query)
{
  c.Country = "Wonder Land";
}
ctx.SubmitChanges();

你可以看到这个简单的体面的代码是如此大的吸引力。 但引擎盖下,.NET运行时只是翻译这更新批次。 如果只有500行,这是500线TSQL批次; 如果有万线,这是一个打击。 当然,有经验的用户也不会用这种方式来做好这项工作,但问题是,它是如此容易陷入这种方式。



Answer 8:

最好的代码是没有代码,并使用存储过程,你必须至少写在应用程序的数据库和代码一些代码来调用它,而与LINQ to SQL或LINQ到实体,你没有写任何额外代码以外的任何其他LINQ查询除了实例化一个上下文对象。



Answer 9:

LINQ肯定有其特定应用的数据库和小企业的地方。

但是,在一个大型企业,在中央数据库作为许多应用中常见的数据中心,我们需要抽象。 我们需要集中管理的安全性和表演的访问历史。 我们需要能够做到影响分析:如果我做一个小改动,数据模型,以满足新的业务需求,需要什么疑问改变,需要重新测试哪些应用? 视图和存储过程给我。 如果LINQ可以做到这一切,使我们的程序员更有效率,我会欢迎它 - 没有人在这种环境中使用它的经验吗?



Answer 10:

一个DBA没有自由更改数据模型不强迫你改变你的编译代码。 使用存储过程,你可以隐藏这些各种各样的变化在一定程度上,因为参数列表和结果集(S)从过程返回代表它的合同,内脏可以四处改变,只是,只要该合同仍满足。

我真的不认为这是一个好处。 能够改变孤立的东西听起来在理论上很好,但只是因为改变履行合同并不意味着它返回正确的结果。 为了能够确定正确的结果是什么,你需要的上下文,你会得到从调用代码这方面。



Answer 11:

恕我直言,RAD = LINQ,RUP =存储的特效。 我在一家大型财富500强公司工作多年,在许多层面,包括管理,并坦率地说,我永远不会雇佣RUP开发商做的RAD开发。 他们是如此孤立,他们非常有限的如何在过程的其他级别做知识。 随着孤立的环境中,这是有道理的给了通过非常具体的入口点数据的DBA控制,因为别人直言不知道实现数据管理的最佳途径。

但大企业移动在发展领域十分缓慢,这是极其昂贵的。 还有,当你需要更快地行动,以节省时间和金钱倍,LINQ提供了多黑桃。

有时我想,数据库管理员是针对LINQ偏差,因为他们觉得这威胁到他们的工作安全。 但是,这是野兽,女士们,先生们的天性。



Answer 12:

我认为你需要去与特效任何东西真的。

A)写作对你的逻辑在LINQ意味着你的数据库是用处不大,因为只有你的应用程序可以使用它。

B)我不相信那个对象建模比关系建模更好反正。

C)测试和开发的SQL存储过程是很多比任何Visual Studio环境中编译编辑周期快的地狱。 您只需编辑,F5和命中选择,你是去比赛。

d)它更易于管理和部署比组件的存储过程..你只是把文件的服务器上,然后按F5 ...

E)的LINQ to SQL有时还写蹩脚的代码时,你就别指望了。

老实说,我认为最终的事情是为MS扩充T-SQL,以便它可以做一个连接投影impliclitly LINQ的方式一样。 T-SQL应该知道,如果你想要做order.lineitems.part,例如。



Answer 13:

LINQ并不禁止使用的存储过程。 我使用的LINQ-SQL和混合模式LINQ-storedproc 。 就个人而言,我很高兴我没有写存储的特效.... pwet-TU。



Answer 14:

此外,有可能回退2.0的问题。 相信我,它发生在我身上了几次,所以我相信它发生在别人。

我也同意,抽象是最好的。 随着事实上,一个ORM的初衷是使RDBMS匹配很好的面向对象的概念。 然而,如果一切LINQ之前工作的罚款由具有从面向对象的概念偏离了一下,然后拧他们。 概念与现实并不总是符合得很好。 没有余地IT好战的狂热分子。



Answer 15:

我假设你的意思的LINQ to SQL

对于任何CRUD命令可以很容易地配置文件存储过程对任何技术的性能。 在这种情况下,两者之间的任何差别可以忽略不计。 尝试剖析了5(简单类型)字段对象超过10万的选择查询,以找出是否有一个真正的区别。

在另一方面,真正的致命弱点将是你是否感觉舒适把你的业务逻辑数据库或没有,这是对存储过程的参数上的问题。



Answer 16:

据大师,我定义LINQ摩托车和SP的汽车。 如果你想要去一次短途旅行,只具有很小的乘客(在这种情况下2),使用LINQ去摆好。 但是,如果你想要去的旅程,并有大乐队,我想你应该选择的SP。

作为结论,摩托车或汽车之间进行选择是取决于你的路线(企业),长度(时间),和乘客(数据)。

希望它能帮助,我可能是错的。 :d



Answer 17:

所有这些问题的答案对LINQ扶着主要谈论的发展是在编码更多或更少的连接到编码或懒惰的质量较差的易用性。 我像只。

一些优点或LINQ,我读到这里,易于测试,易于调试等,但这些都没有地方连接到最终输出或最终用户。 这总是会引起麻烦对性能的最终用户。 请告诉我点在内存中加载很多东西,然后使用LINQ上应用过滤器?

同样类型安全,是警告说:“我们都小心翼翼地避免错误的类型转换”的质量再差,我们正在尝试使用LINQ来改善。 即使在这种情况下,如果在数据库中的任何改变,String列的如大小,然后LINQ需要重新编译,不会是类型安全不认。我试过了。

虽然,我们发现的是良好的,甜的,有趣等与LINQ工作时,它使开发人员偷懒:)剪切缺点并证明1000倍,这是不好的(可能是最差)的性能相比存储的特效。

别偷懒。 我在努力。 :)



Answer 18:

存储特效VS代码 (前面的讨论)



Answer 19:

对于只有一个数据接入点简单的CRUD操作,我会说去LINQ如果你感到舒服的语法。 对于更复杂的逻辑,我认为存储过程都比较efficiant性能明智的,如果你善于T-SQL和更高级的操作。 您也可以从优化顾问,SQL Server事件探查器的帮助下,从SSMS等调试查询



Answer 20:

存储过程使测试更容易,你可以改变查询而不触及应用程序代码。 另外随着LINQ,得到一个数据,并不意味着它的正确的数据。 和测试数据的正确性是指运行的应用程序,但与存储过程中很容易不接触应用程序进行测试。



Answer 21:

结果可以概括为

LinqToSql的小型网站,和原型。 这真的节省了时间原型。

SPS:通用。 我可以微调我的查询,并经常检查ActualExecutionPlan / EstimatedExecutionPlan。



Answer 22:

Create PROCEDURE userInfoProcedure
    -- Add the parameters for the stored procedure here
    @FirstName varchar,
    @LastName varchar
AS
BEGIN

    SET NOCOUNT ON;

    -- Insert statements for procedure here
    SELECT FirstName  , LastName,Age from UserInfo where FirstName=@FirstName
    and LastName=@FirstName
END
GO

http://www.totaldotnet.com/Article/ShowArticle121_StoreProcBasic.aspx



Answer 23:

无论LINQ和SQL有他们的地方。 两者都有自己的缺点和优点。

有时,对于复杂的数据检索可能需要存储的特效。 有时,你可能希望其他人使用SQL Server Management Studio中的存储过程。

LINQ到实体是伟大的,快速发展的CRUD。

当然,你可以打造只使用一个或另一个应用程序。 或者你可以混合起来。 这一切都归结到您的要求。 但是,SQL存储的特效不会很快消失的任何时间。



文章来源: LINQ-to-SQL vs stored procedures? [closed]