2011-12-28 83 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()。 – 2011-12-28 22:56:25

+0

@HenkHolterman - 此方法是Web服務的一部分,'updatedObjects'來自Silverlight應用程序,我不太瞭解EF如何跟蹤更改以實現這一功能,但我認爲這不起作用這裏? – 2011-12-28 23:05:58

回答

3

你可以做到這一點:

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

這比我的回答更加緊湊;我忘了IEnumerable.Any:P – GGulati 2011-12-29 01:20:11

+0

使用任何提出的'本地序列不能用於查詢運算符的LINQ to SQL實現,除了Contains()運算符異常 – 2011-12-29 19:37:38

+0

您可以嘗試updatedObjects.Select(uo => up。 Id).Contains(o.Id) – Guillaume86 2011-12-29 20:46:47

0

您可以創建一個lambda或爲您執行檢查的另一種方法描述來實現與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; 
}