2011-12-28 4 views
2

私は更新するオブジェクトのリストを渡す更新メソッドを書いていますが、私はどのようにLINQクエリを書いて、すべてのオブジェクトを更新メソッドでのLINQの使用 - where句に関する問題

これを更新する必要があるデータベースは、(私が方法がわからない部分に使用擬似コード)私が作るしようとしているLINQクエリと私の更新方法の一例である

void UpdateObjects(List<MyObjects> updatedObjects) 
{ 

    DatabaseContext myContext = new DatabaseContext(); 

    var originalObjectsThatRequireUpdating = from o in myContext.MyObjects 
              where o.ID matches one of updatedObjects.ID 
              select o; 


    foreach (var originalObject in originalObjectsThatRequireUpdating) 
    { 
     IEnumerable<MyObjects> tmpItem = updatedObjects.Where(i => i.ID == originalObject.ID); 

     originalObject.Field1 = tmpItem.ToList()[0].Field1; 
     //copy rest of the fields like this 
    } 

    myContext.SubmitChanges(); 

} 

linqクエリを簡単に作成する方法がわかりません

where o.ID matches one of updatedObjects.ID 

もし私がやっていることを達成するためのより簡単な方法を知っていれば、これは奇妙なやり方だと思っていますが、この時点で私が考える方法は分かっています。

+0

どのようにして 'updatedObjects'を確立していますか?通常、EFは変更を追跡します。必要なのはcontext.SaveChanges()です。 –

+0

@HenkHolterman - このメソッドはWebサービスの一部であり、 'updatedObjects'はSilverlightアプリケーションから来ていますが、EFがその変更を追跡して動作する方法については十分に分かっていませんが、動作しないと仮定していますここに? –

答えて

3

ていること:

where updatedObjects.Any(uo => uo.ID == o.ID) 
+0

これは私の答えよりもコンパクトです。私はIEnumerable.Anyについて忘れてしまいました:P – GGulati

+0

Anyを使うと、Contains()演算子例外を除くクエリ演算子のLINQ to SQL実装でローカルシーケンスを使用できません。 –

+0

updatedObjects.Select(uo => up)を試すことができます。 Id)。コンテナ(o.Id) – Guillaume86

0
あなたは、ラムダまたはあなたのためのチェックを行い、別の方法を作成することができ

で説明しているように例えばLINQとバッチ更新を実装するために探している必要があり、例えば、

where IDMatches(o.ID, updatedObjects) 

となり、IDMatchesをupdatedObjectsの単純な反復として定義します。あなたが行うことができます

static void IDMatches(int id, List<MyObject> updatedObjects) 
{ 
    foreach (MyObject updated in updatedObjects) 
    { 
     if (id == updated.ID) 
      return true; 
    } 
    return false; 
}