【问题标题】:Updating multiple rows Linq vs SQL更新多行 Linq vs SQL
【发布时间】:2008-12-08 00:32:32
【问题描述】:

前段时间我写了一段代码来更新数据库表中的多行。代码是这样的

var db = new MyDataContext();
db.Execute("UPDATE Details SET IsActive = 0 WHERE MasterId = 1");

然后有一天,当我得到文件的最新版本时,我看到有人将代码更改为类似这样的代码

var details = from d in db.details where d.MasterId == 1 select d;
foreach (var detail in details)
  detail.IsActive = false;
db.SubmitChanges();

所以我的问题是:更新多行的更好方法是什么?使用 Linq 还是 SQL?

【问题讨论】:

    标签: .net sql linq


    【解决方案1】:

    查看本文中使用的方法:

    【讨论】:

    【解决方案2】:

    我想说这取决于数据库的效率还是抽象对您来说更重要。 SQL 方式将在您的代码中创建一个更难跟踪但更有效的依赖项。引用的 LINQ 示例消除了对手动编码 SQL 的依赖,但涉及至少 2 个查询和一些服务器端处理。

    【讨论】:

    • 我不会添加额外的答案 - 我的想法是,如果你想要一个答案,那么它必须是 SQL 用于 set 操作,即你想要影响的地方一条语句有很多行,但正如你所说,这实际上是一种权衡,你想做出什么妥协。
    【解决方案3】:

    PLINQO 实现了批量更新和删除,plinqo 生成的每个实体都可以使用批量更新和删除操作。

    context.Task.Update(t => t.Id == 1, t2 => new Task {StatusId = 2});
    

    这将执行Update Task Set StatusId = 2 Where Id = 1

    【讨论】:

      【解决方案4】:
      for (int i = 0; i < pListOrderDetail.Count; i++)
      {
          for (int j = 0; j < stempdata.Count; j++)
          {
              pListOrderDetail[i].OrderID = pOrderID;
              pListOrderDetail[i].ProductID = stempdata[j].pProductID;
              pListOrderDetail[i].Quantity = stempdata[j].pQuantity;
              pListOrderDetail[i].UnitPrice = stempdata[j].pUnitPrice;
              pListOrderDetail[i].Discount = stempdata[j].pDiscount;
              db.SubmitChanges();
              break;
          }
          continue;
      }
      

      【讨论】:

        【解决方案5】:

        Linq-to-SQL 版本将从details 表中与查询匹配的每一行转到SELECT,将它们拉入内存,并为它们创建对象。然后,当它应用更新时,它将为每个对象使用单独的 UPDATE 语句,并且(默认情况下)将包含一个 WHERE 子句,该子句检查每列的值以确保它没有改变SELECT。如果行发生变化,Linq 会抛出异常。

        Linq 版本的代码会大大变慢(想想慢 100 倍或 1000 倍),并让您面临更多异常。

        当您将来重构代码时,SQL 版本可能会更难维护,但它会为您的数据库带来天壤之别。

        我一般觉得 Linq-to-SQL 非常适合选择和单独更新,也许对于小批量的数据库会足够快,以至于额外的查询不会有问题,但我必须在我之前仔细考虑将 Linq 用于大批量或在 Web 服务器上。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-10-26
          • 2011-09-17
          • 2012-05-20
          • 1970-01-01
          相关资源
          最近更新 更多