LINQ jointure interne entre Ienumerable et DB Table
-
05-07-2019 - |
Question
J'essaie de déterminer les enregistrements à supprimer d'une base de données lorsqu'un utilisateur soumet un formulaire. La page contient deux listes CheckBoxList, l’une représentant les enregistrements avant modification et l’autre après.
Je peux facilement obtenir les valeurs sélectionnées qui doivent être supprimées comme ceci ...
//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;
maintenant j'essaie de faire quelque chose comme ça mais ça ne le permet pas ...
var itemsToDelete = from specialNeed in db.SpecialNeeds
join oldSelectedItem in oldSelectedItems on specialNeed.SpecialNeedsTypeCd equals oldSelectedItem.Value
where specialNeed.CustomerId == customerId
Je peux facilement utiliser une boucle foreach et un .DeleteOnSubmit () pour chaque élément, mais je pense qu'il existe un moyen d'utiliser la fonctionnalité de LINQ et de transmettre l'ensemble du résultat de la requête d'une jointure interne à .DeleteAllOnSubmit ()
//like so
db.SpecialNeeds.DeleteAllOnSubmit(itemsToDelete);
Des idées?
La solution
Les collections locales peuvent être utilisées dans LINQ to SQL avec la méthode Contains (). Vous pouvez essayer de changer la clause join en où avec Contains ():
var itemsToDelete = from specialNeed in db.SpecialNeeds
where oldSelectedItems.Contains(specialNeed.SpecialNeedsTypeCd)
&& specialNeed.CustomerId == customerId
select ...;
Autres conseils
Quelle est l'erreur que vous obtenez? S'agit-il d'une incompatibilité de type entre SpecialNeedsTypeCd et oldSelectedItem.Value? Avez-vous simplement omis de sélectionner l'élément sélectionné dans la deuxième déclaration Linq de ce message ou est-ce le problème?