前段时间我写了一段代码来更新数据库表中的多行。代码就像这样
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?
答案 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服务器上使用。