2011-11-02 93 views
1

有點簡單的問題,但我完全失去了如何處理這個問題。LINQ到SQL更新多個記錄

CREATE TABLE Contract (
    id int PRIMARY KEY, 
    batchId int NOT NULL REFERENCES ContractBatch (id) 
    campaignId int NULL REFERENCES Campaign (id) 
) 

這是我的業務模型中對Linq2Sql模型的簡化表。現在我需要做更新查詢是這樣的:

UPDATE Contract SET campaignId = 1 WHERE batchId = 5 

這意味着,有可能爲同一ContractBatch更多的記錄,我需要設置Campaign爲他們所有。是否有可能以一些簡單的方式將此查詢轉換爲Linq表達式?只有我能夠找到的方式是獲取所有那些ContractBatch的記錄,然後在循環中逐一更新。這不是非常有效。

var campaignId = 1; 
var batchId = 5; 
using(var dataContext = new DataModel.ModelDataContext()) { 
    dataContext.Contracts 
     .Where(c => c.BatchId == batchId) 
     // this is obviously my "wish to have" method 
     .ForEach(c => c.CampaignId = campaignId) 
    dataContext.SubmitChanges() 
} 

我已經考慮在老辦法做,用手執行該查詢。我不喜歡它,但它可能比運行數百個更新查詢要好。

回答

5

你說得對,這種方法有兩個問題 - 你將執行數百個單獨的更新語句,你必須首先閱讀它們來做改變。

這是ORM的一個常見弱點。

以下幾個谷歌的鏈接我發現下面的博客文章,裏面確實有一些有趣的事情在這方面說: http://www.aneyfamily.com/terryandann/post/2008/04/Batch-Updates-and-Deletes-with-LINQ-to-SQL.aspx

+0

謝謝。所以這是我的想法。我只會抽出那些老式的文本查詢並忘記它。 – FredyC

+0

最簡單的方法是使用DataContext.ExecuteQuery方法 - 保存所有安裝的東西。 –

1

您可以使用存儲過程並在您的DataContext中執行它。請參閱this post瞭解更多詳情。

+0

嗯,我在數據庫中沒有控制遺憾的是,增加存儲過程是不是一種選擇。 – FredyC