346 votes

Comment supprimer plusieurs lignes dans Entity Framework (sans foreach)

Je suis la suppression de plusieurs éléments d'un tableau à l'aide de Entity Framework. Il n'y a pas de clé étrangère / objet parent donc je ne peux pas gérer cela avec OnDeleteCascade.

Droit maintenant, je suis en train de faire ceci:

var widgets = context.Widgets
    .Where(w => w.WidgetId == widgetId);

foreach (Widget widget in widgets)
{
    context.Widgets.DeleteObject(widget);
}
context.SaveChanges();

Il fonctionne, mais le foreach qui me dérange. Je suis en utilisant EF4, mais je ne veux pas exécuter SQL. Je veux juste m'assurer que je ne suis pas manque quoi que ce soit - c'est aussi bon qu'il obtient, droit? Je peux abstrait avec une méthode d'extension ou d'aide, mais quelque part, nous allons toujours être de faire un foreach, droit?

722voto

user1308743 Points 3433

Entity Framework 6 en a fait un peu plus facile avec `` .

Exemple :

76voto

Vlad Bezden Points 5024
using (var context = new DatabaseEntities())
{
    context.ExecuteStoreCommand("DELETE FROM YOURTABLE WHERE CustomerID = {0}", customerId);
}

74voto

<blockquote> <p>C’est aussi bon qu’il obtient, non ? Je peux le résumé avec une méthode d’extension ou d’assistance, mais quelque part, nous allons encore faire un foreach, droite ?</p> <p>Eh bien, oui, mais vous pouvez en faire un deux-liner :</p><pre><code></code></pre></blockquote>

53voto

Alex James Points 15939

Si vous ne voulez pas exécuter SQL directement appeler DeleteObject dans une boucle est le meilleur que vous pouvez faire aujourd'hui.

Toutefois, vous pouvez exécuter SQL et pas toujours complètement général via une méthode d'extension, à l'aide de l'approche que j'ai à décrire ici.

Bien que cette réponse a été de 3.5. Pour la version 4.0 je serais probablement utiliser la nouvelle ExecuteStoreCommand de l'API sous le capot, au lieu de descendre dans la StoreConnection.

41voto

ericbl Points 355

Malheureusement, les gens de Entity Framework juste ne semblent pas avoir suffisamment d’expérience avec des applications professionnelles pour comprendre la nécessité pour les ensembles de mises à jour et des suppressions. En fait, aucune des personnes qui travaillent sur les ORM pour toute entreprise semblent avoir la moindre idée.

En passant les chaînes SQL à une défaites API le but entier d’avoir une approche fortement typée. Il n’est pas la bonne réponse.

Ne serait-il pas merveilleux si nous pouvions faire quelque chose comme ceci :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X