更新多行Linq vs SQL

时间:2008-12-08 00:32:32

标签: .net sql linq

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

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?

5 个答案:

答案 0 :(得分:14)

检查本文中使用的方法:

答案 1 :(得分:9)

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

答案 2 :(得分:4)

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

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

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

答案 3 :(得分:1)

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;
}

答案 4 :(得分:0)

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

Linq版本的代码将 MUCH 更慢(比较慢100倍或1000倍),并向您展示其他例外情况。

在将来重构代码时,SQL版本可能会有点难以维护,但它会对您的数据库造成不同的影响。

我一般认为Linq-to-SQL非常适合选择和个人更新,也许对于小批量数据库来说,数据库速度足够快,额外的查询不会有问题,但我必须仔细考虑之前使用Linq进行大批量处理,或者在Web服务器上使用。