2011-10-18 119 views
5

我有一個實體框架EntityCollection如何從實體框架集合中刪除項目子集

我需要從數據庫中刪除與給定where子句匹配的所有項目。這是我的現有代碼:

// Perform the deletes 
foreach (var deleteReq in order.Requirements.Where(x=>!orderContract.Requirements.Any(y=>y.RequirementId==x.RequirementId))) 
{ 
    order.Requirements.Remove(deleteReq); 
} 

基本上我試圖刪除從order.Requirements的集合,是不是在orderContract.Requirements集(上一個ID對應)任何東西。

正如你可能猜到的,這段代碼拋出異常,因爲我正在修改我正在迭代的集合。

通常我只是使用RemoveAll(),但EntityCollection不支持該方法。

所以...我怎樣才能刪除我需要的所有記錄?

+0

爲什麼你不能收集列表中的可移動項目?收藏大小很大? –

回答

11

我創建了一個單獨的列表,它似乎已經奏效:

// Perform the deletes 
var reqsToDelete = order.Requirements.Where(x=>!orderContract.Requirements.Any(y=>y.RequirementId==x.RequirementId)).ToList(); 
foreach (var deleteReq in reqsToDelete) 
{ 
    order.Requirements.Remove(deleteReq); 
} 

這樣一來,當我從order.Requirements列表中刪除的項目,它是不影響,我迭代列表。

6

將要刪除的所有Requirement實體收集到列表中。

然後從Requirements實體集合中刪除其中的每一個,而不是從order.Requirements中刪除。

+0

唉,在我正在執行刪除操作的位置,將很難獲得Requirements實體集合。 (我在AutoMapper ITypeConverter中。) – Vaccano

+1

至少,您將無法在foreach循環中刪除,請嘗試在列表中收集它。然後在循環外嘗試手動刪除它。 – Birey

1

此前EF6,有更好的性能和更簡潔的API

var deleteQuery = order 
    .Requirements 
    .Where(x=> !orderContract.Requirements.Any(y=>y.RequirementId == x.RequirementId)); 

order.Requirements.RemoveRange(deleteQuery); 

一個RemoveRange方法現在,EF不會刪除之前加載的每個項目,因爲它是公認的答案的情況下。