2011-11-02 7 views
1

簡単な問題はありますが、これに近づく方法は完全に失われています。linq to SQL複数のレコードを更新する

これはLinq2Sqlモデルの私のビジネスモデルでは単純化されたテーブルです。意味

UPDATE Contract SET campaignId = 1 WHERE batchId = 5 

は、同じContractBatchのための複数のレコードがあることができ、私はそれらのすべてのためのCampaignを設定する必要があります。今、私はこのような更新クエリを行う必要があります。このクエリを簡単な方法でLinq式に変換することは可能ですか?私が見つけることができる唯一の方法は、そのContractBatchのすべてのレコードをフェッチして、ループで1つずつ更新します。これはあまり効率的ではありません。

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

このアプローチには2つの問題があることは間違いありません。何百もの個別の更新ステートメントが実行され、最初に変更ステートメントを読む必要があります。

これはORMの一般的な弱点です。

は、私は、この地域に言いたいことがいくつかの興味深いものを持っていた、以下のブログ記事を見つけたいくつかのGoogleのリンクを以下に示します。 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

関連する問題