2008-12-08 102 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進行大批量或者網絡服務器。