2011-10-18 15 views
5

Ho una struttura di entità EntityCollection.Come rimuovere un sottoinsieme di elementi da una raccolta di Entity Framework

Devo cancellare tutti gli elementi che corrispondono a una data clausola dal database. Questo è il mio codice esistente:

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

Fondamentalmente sto cercando di rimuovere qualsiasi cosa dalla raccolta order.Requirements che non è nella collezione orderContract.Requirements (corrispondenti su un Id).

Come si può intuire, questo codice genera ed eccezione perché sto modificando la raccolta che sto iterando.

Normalmente userei solo RemoveAll() ma lo EntityCollection non supporta questo metodo.

Quindi ... Come posso eliminare tutti i record necessari?

+0

Perché non è possibile raccogliere elementi rimovibili in un elenco? la dimensione della collezione è grande? –

risposta

11

ho creato un elenco separato e sembra aver funzionato:

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

questo modo, quando tolgo la voce dalla lista order.Requirements, non sta interessando la lista che io sono l'iterazione.

6

raccogliere tutte le entità Requisito che si desidera eliminare in un elenco.

Quindi rimuovere ciascuno di quelli dalla raccolta Entità requisiti piuttosto che da ordine.Requisiti.

+0

Purtroppo, nella posizione in cui sto eseguendo l'eliminazione, sarebbe molto difficile ottenere la raccolta di entità Requisiti. (Sono in un AutoMapper ITypeConverter.) – Vaccano

+1

Almeno, non è possibile eliminare all'interno del ciclo foreach, provare a raccoglierlo in un elenco. Quindi al di fuori del ciclo prova a eliminarlo manualmente. – Birey

1

Prima EF6, c'è un metodo RemoveRange per migliorare le prestazioni e l'API più pulito

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

order.Requirements.RemoveRange(deleteQuery); 

Ora, l'EF solito caricare ogni articolo prima di rimuovere, in quanto è un caso nella risposta accettata.

Problemi correlati