Join interno LINQ tra Ienumerable e DB Table
-
05-07-2019 - |
Domanda
Sto cercando di determinare quali record eliminare da un database quando un utente invia un modulo. La pagina ha due CheckBoxList che rappresentano i record prima della modifica e uno dopo.
Posso facilmente ottenere i valori selezionati che devono essere eliminati in questo modo ...
//get the items not selected that were selected before
var oldSelectedItems = from oItem in oldChklSpecialNeeds.Items.Cast<ListItem>()
where !(from nItem in newChklSpecialNeeds.Items.Cast<ListItem>()
where nItem.Selected
select nItem.Value).Contains(oItem.Value)
&& oItem.Selected
select oItem.Value;
ora sto provando a fare qualcosa del genere ma non lo consente ...
var itemsToDelete = from specialNeed in db.SpecialNeeds
join oldSelectedItem in oldSelectedItems on specialNeed.SpecialNeedsTypeCd equals oldSelectedItem.Value
where specialNeed.CustomerId == customerId
Posso facilmente usare un ciclo foreach e un .DeleteOnSubmit () per ogni elemento, ma sto pensando che c'è un modo di usare la funzionalità di LINQ e passare l'intero risultato della query di un join interno a .DeleteAllOnSubmit ()
//like so
db.SpecialNeeds.DeleteAllOnSubmit(itemsToDelete);
Qualche idea?
Soluzione
Le raccolte locali possono essere utilizzate in LINQ to SQL con il metodo Contains (). Puoi provare a cambiare la clausola join in una dove con Contains ():
var itemsToDelete = from specialNeed in db.SpecialNeeds
where oldSelectedItems.Contains(specialNeed.SpecialNeedsTypeCd)
&& specialNeed.CustomerId == customerId
select ...;
Altri suggerimenti
Qual è l'errore che stai riscontrando? È una mancata corrispondenza del tipo tra SpecialNeedsTypeCd e oldSelectedItem.Value? Hai appena omesso la selezione nella seconda istruzione Linq in questo post o è questo il problema?