2008-12-08 105 views
17

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

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?

回答

9

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

+0

我不会添加额外的答案 - 我的想法是,如果你想要一个答案,那么它将不得不是一个* set *操作的SQL,即你想用单个语句影响很多行的地方,但作为你说它实际上是一个折衷,你想做什么妥协。 – Murph 2009-11-18 20:05:22

4

PLINQO已经实现了批量更新和删除,并通过PLINQO产生可以使用批量更新和删除操作的每个实体。

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

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

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

的LINQ到SQL版本中的每一行要SELECTdetails表的查询相匹配,拉他们到内存中,并创建对象他们。然后,当它应用更新时,它将为每个对象使用单独的UPDATE语句,并将(默认情况下)包含一个WHERE子句,该子句检查每列的值以确保自从执行SELECT以来它没有更改。如果行已经改变,Linq会抛出一个异常。

该代码的Linq版本将是更慢慢(认为是100倍或1000倍慢),并暴露给你额外的例外。

随着您在未来重构代码时,SQL版本可能难以维护,但它会对您的数据库产生不同的影响。

我一般认为Linq-to-SQL对选择和单个更新非常有用,也可能对于小批量的数据库来说足够快以至于额外的查询不会有问题,但是我必须仔细考虑我使用Linq进行大批量或者网络服务器。