2009-08-12 15 views
13

私は値を更新する必要がありますが、私はそれを行うには、すべてのテーブルの値をループしています:Linq-To-SQLで更新するには?

public static void Update(IEnumerable<Sample> samples 
    , DataClassesDataContext db) 
{ 
    foreach (var sample in db.Samples) 
    { 
     var matches = samples.Where(a => a.Id == sample.Id); 
     if(matches.Any()) 
     { 
      var match = matches.First(); 
      match.SomeColumn = sample.SomeColumn; 
     } 
    } 
    db.SubmitChanges(); 
} 

私は上記のコードは、それを行うには正しい方法ではありませんが、私は任意の考えることができませんでした確信しています他の方法はまだありません。より良い方法を見せてくれますか?

+0

接続されていないエンティティから接続されたエンティティを更新しようとしていますか? – Marc

+0

はい、接続されていないエンティティから接続されたエンティティを更新しようとしています –

答えて

24

はい、より簡単な方法があります。ずっと簡単です。エンティティをコンテキストにアタッチしてから、リフレッシュ(KeepCurrentValuesを選択)すると、Linq to SQLはそれらのエンティティをサーバから取得し、それらを比較し、異なるものをマークします。あなたのコードは次のようになります。この場合

public static void Update(IEnumerable<Sample> samples 
    , DataClassesDataContext db) 
{ 
    db.Samples.AttachAll(samples); 
    db.Refresh(RefreshMode.KeepCurrentValues, samples) 
    db.SubmitChanges(); 
} 

、LINQ to SQLのは、限り、あなたの鍵が同期しているとして、あなたは罰金だそう一致するキーを使用して更新レコードされます。

+1

意味の訂正が小さく、「更新しました」とは表示されません。それは、各プロパティの「元の値」をデータベースから読み取った値で置き換えます。各プロパティの「現在の値」は変更されていないので、SubmitChangesは、(メソッドに渡された)現在の値とは異なる元の値(サーバーから読み取られた)を持つレコードを更新することを知ります。 –

+3

FYI、これは、サンプルがデータベースに存在するもののサブセットである場合にのみ機能します。 2つの仮定が存在する。 1.誰も、この表からサンプル列挙に存在するレコードを削除しません。 2.したがって、サンプルコレクションには、追加した新しいエントリは含まれません。 – Marc

7

Linq2Sql(またはLinq to Entities)では、サーバー上のレコードを完全に最初に取得せずに更新する方法はありません。したがって、実際には正しく実行されています。

これを回避するには、必要な処理を行うストアドプロシージャを作成してモデルに追加します。

私はそれはしかし、あなたの意図した質問だった場合:)

*全くわからない:SELECTステートメントを構築し、何とかUPDATEに結果のSELECT文を肉屋するために、その使用LINQの周りのいくつかのハッキングがありますが、私はそれをお勧めしません。