LINQ unión interna entre Ienumerable y DB Table
-
05-07-2019 - |
Pregunta
Estoy tratando de determinar qué registros eliminar de una base de datos cuando un usuario envía un formulario. La página tiene dos CheckBoxList, uno que representa los registros antes de la modificación y el otro después.
Puedo obtener fácilmente los valores seleccionados que deben eliminarse de esta forma ...
//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;
ahora estoy tratando de hacer algo como esto pero no lo permite ...
var itemsToDelete = from specialNeed in db.SpecialNeeds
join oldSelectedItem in oldSelectedItems on specialNeed.SpecialNeedsTypeCd equals oldSelectedItem.Value
where specialNeed.CustomerId == customerId
Puedo usar fácilmente un bucle foreach y un .DeleteOnSubmit () para cada elemento, pero creo que hay una forma de usar la funcionalidad de LINQ y pasar todo el resultado de la consulta de una unión interna a .DeleteAllOnSubmit ()
//like so
db.SpecialNeeds.DeleteAllOnSubmit(itemsToDelete);
¿Alguna idea?
Solución
Las colecciones locales se pueden usar en LINQ to SQL con el método Contains (). Puede intentar cambiar la cláusula unirse a un donde con Contains ():
var itemsToDelete = from specialNeed in db.SpecialNeeds
where oldSelectedItems.Contains(specialNeed.SpecialNeedsTypeCd)
&& specialNeed.CustomerId == customerId
select ...;
Otros consejos
¿Cuál es el error que está recibiendo? ¿Es una falta de coincidencia de tipo entre SpecialNeedsTypeCd y oldSelectedItem.Value? ¿Acaba de omitir la selección en la segunda declaración de Linq en esta publicación o es el problema?