2011-10-18 15 views
5

私はエンティティフレームワークEntityCollectionを持っています。Entity Frameworkコレクションからアイテムのサブセットを削除する方法

データベースから特定のwhere句に一致するすべての項目を削除する必要があります。これは私の既存のコードです:

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

は基本的に私は(IDに一致する)orderContract.Requirementsコレクションにないorder.Requirementsコレクションから何かを削除しようとしています。

私が反復しているコレクションを変更しているので、このコードはスローされ、例外が発生します。

通常はRemoveAll()を使用しますが、EntityCollectionはその方法をサポートしていません。

だから私は必要なすべてのレコードを削除できますか?

+0

リムーバブルアイテムをリストで収集できないのはなぜですか?コレクションのサイズは大きいですか? –

答えて

11

私は別々のリストを作成し、働いているようだ:私はorder.Requirementsリストから項目を削除すると、それは私が反復していリストに影響を与えていない、

// 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); 
} 

その方法。

6

削除するすべての要件エンティティをリストにまとめます。

次に、order.RequirementsではなくRequirementsエンティティコレクションからそれぞれを削除します。

+0

悲しいかな、削除している場所では、要件エンティティコレクションを取得するのが非常に難しいでしょう。 (私は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は文句を言わない、削除する前に各項目を読み込みます。

関連する問題