.net LINQ查询与存储过程

.net LINQ查询与存储过程,.net,sql-server,linq,linq-to-sql,entity-framework,.net,Sql Server,Linq,Linq To Sql,Entity Framework,使用linq查询(以及类似EF或linq2sql的ORM)与存储过程(SQLServer2008)来查询和更新数据模型的优缺点是什么?演出速度等等。这取决于您使用的SQL版本。SQL 2008中的执行计划(SQL用来加快第二次调用速度的信息…)在O/RM中也非常有效。 我不明白为什么要使用O/RM,并通过将所有内容重新映射到自定义存储过程来节省大量时间。 也是一个存储过程。很难成为TDD,并且不允许您使用工作和事务单元的概念当您在代码中时,Linq肯定更具可读性。作为一名开发人员,看到调用以执行

使用linq查询(以及类似EF或linq2sql的ORM)与存储过程(SQLServer2008)来查询和更新数据模型的优缺点是什么?演出速度等等。

这取决于您使用的SQL版本。SQL 2008中的执行计划(SQL用来加快第二次调用速度的信息…)在O/RM中也非常有效。 我不明白为什么要使用O/RM,并通过将所有内容重新映射到自定义存储过程来节省大量时间。
也是一个存储过程。很难成为TDD,并且不允许您使用工作和事务单元的概念

当您在代码中时,Linq肯定更具可读性。作为一名开发人员,看到调用以执行名为“sp_GetSomething”的存储过程不会告诉您任何事情,除非您亲自查看存储过程的功能。看到类似代码的

var query = from c in db.TableName
            where c.Name == "foo"
            select c;
这会准确地告诉您正在提取哪些数据

另一方面,如果决定更改代码,则存储过程不需要重新编译应用程序。如果您决定突然更改“
where
”子句或通过更改
顺序,那么更改存储过程很容易。更改Linq代码可能更耗时


我相信还有很多,但我注意到有两个。

出于以下几个原因,我几乎总是使用存储过程:

1) 在代码中使用LINQ查询数据库实际上并没有遵循多层体系结构的原则。。。任何涉及访问数据库对象的操作都应该在数据库级别进行。LINQ查询只是在代码中编写SQL的包装器。代码中的SQL或LINQ是不允许的,即使MVC示例都这样做

2) 表演。。。存储过程执行得更快!无论何时从代码运行查询,都容易出现可伸缩性和性能问题


3) 维修。因为存储过程将您从SQL或LINQ代码中解放出来,所以存储过程的维护可以单独进行(关注点的分离)。

我同意Peter Lee的观点-在一个严肃的企业级环境中,使用存储过程可能是首选方法

除了Peter的评论,这里还有一些:

  • EF或LINQtoSQL(也可以是NHibernate)是ORM,这意味着它们希望将数据库表中的一行转换为对象。由于该对象通常应包含该表中的所有值(或者在EF的情况下,甚至包含多个表中的值),因此这些ORM通常使用
    SELECT*from…
    方法。这意味着:由于您选择了所有列,因此通常无法使用任何覆盖索引,您的性能将受到影响。这是一个经典的“方便与性能”权衡

  • 我所知道和使用过的所有ORM基本上都需要对基本表进行完整的表访问。对于许多企业及其DBA来说,这是一个很大的禁忌。明智地使用存储过程,您不必允许所有用户访问基表,这是访问安全性方面的一大优势


  • 有两个阵营:用于存储过程和反对存储过程

    我发现正是缺乏经验才使人们走上了这样或那样的道路。我们开发的商店种类繁多

    实际上

    • 如果你是一个公司程序员,那么你永远不会改变你的RDBMS平台。您不时地重构您的客户机,然后重新实现DAL/存储库。为什么?使用存储的进程
    • 如果您为一个供应商工作,那么您可能需要支持多个RDBMS。ORM主要将其抽象出来
    我在一家公司的商店所以

    • 优点:使用Linq,您不必知道SQL

    • 缺点:出了问题你就完蛋了
    我们(作为一个开发人员DBA团队)经常需要帮助姐妹团队中的ORM用户

    还有一些更微妙的问题,例如:

    • 任何客户端都可以使用存储过程
    • 在EF或.NET5带来的任何东西中进行重构的时间都会更长
    • 由存储过程提供的用于抽象模式的封装
    • 减少了往返,因为存储的过程不应该像方法或原子调用那样处理吗
    这并不是对你问题的真正回答,但别忘了你仍然可以使用

    真正的答案是“马为课程”。从一个角度来看(作为像@gbn这样的数据库开发人员),它一直都是存储过程。从我作为一名后台端到端web开发人员的角度来看,应用程序的并发使用率从未超过100,而且在编写高效SQL方面也不出色,一直以来都是LINQ(目前的EF 4.1)。如果我能逃脱的话,先编码。这是我今天读到的关于这个问题的第15篇文章(在一次开发会议上争论之后),每一篇文章似乎都暗示了同样的事情——“马为课程”。有时,在后台工作环境中,您需要考虑的不仅仅是数据获取效率,还包括您修复bug的速度(效率),以及下一个人看到您的代码所做操作的方便程度(效率)。从这个角度来看,LINQ可以轻而易举地获胜。

    @gbn有一个很好的答案

    在拥有数亿条记录的大型系统中,表示层上的数据操作无法解决这一问题。数据密集型应用程序(不是博客应用程序!)需要比您想象的更快地扩展

    在开发中小型系统时,ORM可以大大节省时间。通过正确实施的orm,您可以立即拥有一个生产就绪的应用程序。没有人喜欢写crud


    同样重要的是要记住,SQL语法已经保持了20多年的一致性。如果这对您来说并不重要,那么您的编程时间还不够长。

    我的首选是LINQ,检查EF Profiler等工具中生成的查询。如果生成的任何查询太长或创建N+1,通常可以修复它们
    string name = ...
    var list = connection.Query<YourType>(
        "select * from TableName where Name=@name",
        new { name }).ToList();
    
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;