2009-05-23 202 views
0

有沒有人有關於如何在LINQ中運行以下語句的一些想法?LINQ to SQL更新

UPDATE FileEntity SET DateDeleted = GETDATE() WHERE ID IN (1,2,3) 

我已經來到了愛和恨LINQ,但到目前爲止一直沒有得到很好的結果。我想避免的顯而易見的解決方案是枚舉所有文件實體並手動設置它們。

foreach (var file in db.FileEntities.Where(x => ids.Contains(x.ID))) 
{ 
    file.DateDeleted = DateTime.Now; 
} 
db.SubmitChanges(); 

有與上面的代碼,除了相當大的開銷的問題是,每個實體具有可以相當大,因此對於大的更新有很多數據運行的交叉對於沒有特別的數據庫連接的數據字段原因。 (LINQ解決方案是延遲加載數據屬性,但如果有一些方法只是使用LINQ to SQL更新字段,則不需要)。

我想一些查詢表達式提供商的事情,將導致上述T-SQL ...

回答

2

LINQ不能在商店的更新執行 - 這是語言集成查詢,無法更新。大多數(可能甚至全部)或映射器將生成一個select語句來獲取數據,在內存中修改它,並使用單獨的更新語句執行更新。智能OR映射器只會獲取主鍵直到需要額外的數據,但他們通常會獲取所有的數據,因爲一次只獲取一個屬性會花費太多的代價。

如果您確實在意這種優化,請使用存儲過程或手寫SQL語句。如果你想要compacter代碼,你可以使用下面的代碼。

db.FileEntities. 
    Where(x => ids.Contains(x.ID)). 
    Select(x => x.DateDeleted = DateTime.Now; return x;); 

db.SubmitChanges(); 

我不喜歡這樣,因爲我覺得它不太可讀,但有些人更喜歡這樣的解決方案。

0

LINQ to SQL是一個ORM,就像任何其他的一樣,正因如此,它沒有被設計爲處理批量更新/插入/刪除。 L2S,EF,NHibernate,LLBLGen和其他的一般思想是爲您處理關係數據到您的對象圖的映射,而不需要管理大型存儲過程的庫,這最終會限制您的靈活性和適應性。

當談到批量更新時,最好留給他們最好的東西......數據庫服務器。 L2S和EF都提供了將存儲過程映射到模型的功能,這允許您存儲的過程在某種程度上以實體爲導向。自從您使用L2S以來,只需編寫一個將身份集作爲輸入的proc,並在問題開始時執行SQL語句。將存儲的proc拖到你的L2S模型上,然後調用它。

它是手頭問題的最佳解決方案,它是批量更新。與報告一樣,對象圖和對象關係映射不是批量處理的最佳解決方案。