2010-07-08 49 views
15

實體框架,我試圖從我的對象上下文刪除一些對象,如認爲:DeleteObject的()在foreach循環

foreach (var item in context.Items.Where(i => i.Value > 50)) 
{ 
    context.Items.DeleteObject(item); 
} 

有了這個代碼,我有一個「集合被修改」異常。

那麼,我該怎麼做批量刪除?

回答

26

您必須先將要刪除的項目從要修改的集合中取出。您可以(使用ToList()來強制執行)用一個簡單的LINQ查詢做到這一點:

var toDelete = context.Items.Where(i => i.Value > 50).ToList(); 

foreach(var item in toDelete) 
{ 
    context.Items.DeleteObject(item); 
} 

或者,如果你喜歡簡潔的語法(我不這樣做,在這種情況下),你可以使用:

context.Items 
    .Where(i => i.Value > 50) 
    .ToList() 
    .ForEach(item => context.Items.DeleteObject(item)); 
+0

非常聰明。我只是寫了一個類似的答案,但你是第一個。 – Jeroen 2010-07-08 14:26:42

+2

也許會有趣的提到爲什麼.ToList()添加在行的末尾: var toDelete = context.Items.Where(i => i.Value> 50).ToList(); ...它是什麼引起的:-) – Mariusz 2011-07-25 19:14:30

4

在foreach中,當Collection被修改時,你會得到異常。

解決方案: 複製您的收藏。

context.Items.Where(i => i.Value > 50).ToList().ForEach(item => context.Items.Remove(item)); 
+0

聰明。比第一個答案更少的代碼。 – Jeroen 2010-07-08 14:28:48

+0

你會從我那裏得到一個+1,但你需要修正你的語法。 – 2010-07-08 14:31:13

+0

啊,對不起@Justin。我們在內部有一些擴展,就像所有的集合都能得到這種擴展。這就是所謂的Each()。 和順便說一句,如果你在一行這麼多操作,請不要忘記它的文檔! – cRichter 2010-07-08 14:45:15