web-dev-qa-db-fra.com

Suppression en masse dans LINQ to Entities

Existe-t-il un moyen de supprimer en bloc un groupe d'objets correspondant à une requête donnée dans LINQ ou LINQ-to-Entities? Les seules références que je peux trouver sont obsolètes, et il semble ridicule de parcourir et de supprimer manuellement tous les objets que je souhaite supprimer.

79
Benjamin Pollack

La question est ancienne (d’avant la création de EF5). Pour ceux qui utilisent EF5, EntityFramework.Extended le fait en un clin d'œil.

29
Shaul Behr

Il y a quelque temps, j'ai écrit une série de blogues en 4 parties (Parts 1 , 2 , 3 et 4 ) couvrant les mises à jour groupées (avec une seule commande) dans Entity Framework.

Bien que l’objectif de cette série ait été de mettre à jour, vous pouvez certainement utiliser les principes impliqués pour supprimer.

Vous devriez donc pouvoir écrire quelque chose comme ceci:

var query = from c in ctx.Customers
            where c.SalesPerson.Email == "..."
            select c;

query.Delete();

Tout ce que vous avez à faire est d'implémenter la méthode d'extension Delete (). Voir la série d'articles pour des astuces sur la façon de ...

J'espère que cela t'aides

56
Alex James
    using (var context = new DatabaseEntities())
    {
        // delete existing records
        context.ExecuteStoreCommand("DELETE FROM YOURTABLE WHERE CustomerID = {0}", customerId);
    }
40
Vlad Bezden

Les réponses que je vois ici sont Linq to SQL

DeleteAllOnSubmit fait partie de System.Data.Linq et ITable, qui correspond à Linq to Sql

Cela ne peut pas être fait avec Entity Framework.

Ayant dit tout cela, je n'ai pas encore de solution mais je posterai quand je le ferai.

6
Phil Strong

Pour ceux qui utilisent EF6 et souhaitent exécuter une requête SQL de ligne pour suppression:

using (var context = new DatabaseEntities())
{
    // delete existing records
    context.Database.ExecuteSqlCommand("DELETE FROM YOURTABLE WHERE CustomerID = @id", idParameter);
}
4
Uriil

Je sais de DeleteAllOnSubmit méthode de tout contexte de données qui supprimera tous les enregistrements de la requête. Il doit y avoir une optimisation sous-jacente car de nombreux objets sont en cours de suppression. Je ne suis pas sûr cependant.

2
Hemant

Je ne suis pas sûr de son efficacité, mais vous pouvez essayer quelque chose comme ceci:

// deletes all "People" with the name "Joe"
var mypeople = from p in myDataContext.People
               where p.Name == "Joe";
               select p;
myDataContext.People.DeleteAllOnSubmit(mypeople);
myDataContext.SubmitChanges();
2
Scott Anderson

Je ferais quelque chose comme:

var recordsToDelete = (from c in db.Candidates_T where c.MyField == null select c).ToList<Candidates_T>();
if(recordsToDelete.Count > 0)
{
    foreach(var record in recordsToDelete)
    {
        db.Candidate_T.DeleteObject(record);
        db.SaveChanges();
    }
}   

Je ne pense pas qu'il soit possible de le faire sans boucle puisque Entity Framework fonctionne avec des entités et que, la plupart du temps, cela signifie une collection d'objets.

1
G Jeny Ramirez

Vous pourriez écrire un proc stocké qui effectue la suppression et l'appeler depuis LINQ. Une suppression basée sur un ensemble est probablement plus rapide dans l'ensemble, mais si elle affecte trop d'enregistrements, vous risquez de provoquer des problèmes de verrouillage et vous aurez peut-être besoin d'une combinaison hybride de séquences d'enregistrements (peut-être 2000 à la fois. point de départ si vous trouvez que la suppression basée sur un jeu prend tellement de temps qu’elle affecte l’utilisation ultérieure de la table) pour effectuer la suppression. 

1
HLGEM

Dans cet exemple, je reçois les enregistrements à supprimer et les attache un par un au jeu de résultats, puis demande leur suppression. Ensuite, j'ai 1 sauvegarde des modifications.

    using (BillingDB db = new BillingDB())
    {
      var recordsToDelete = (from i in db.sales_order_item
                  where i.sales_order_id == shoppingCartId
                  select i).ToList<sales_order_item>();

      if(recordsToDelete.Count > 0)
      {
        foreach (var deleteSalesOrderItem in recordsToDelete)
        {                  
            db.sales_order_item.Attach(deleteSalesOrderItem);
            db.sales_order_item.Remove(deleteSalesOrderItem);                  
        }
        db.SaveChanges();
      } 
    }
1
Demodave

La suppression de données via Entity Framework repose sur l'utilisation de la méthode DeleteObject. Vous pouvez appeler cette méthode sur EntityCollection pour la classe d'entité à supprimer ou sur l'ObjectContext dérivé. Voici un exemple simple:

NorthwindEntities db = new NorthwindEntities();

IEnumerable<Order_Detail> ods = from o in db.Order_Details
                                where o.OrderID == 12345                                    
                                select o;

foreach (Order_Detail od in ods) 
    db.Order_Details.DeleteObject(od);

db.SaveChanges();
1
Amin
 context.Entity.Where(p => p.col== id)
               .ToList().ForEach(p => db.Entity.DeleteObject(p));

c'est la méthode la plus rapide pour supprimer un enregistrement de la base de données en utilisant EF 

1
Anurag Deokar

RemoveRange a été introduit dans EF6, il peut supprimer une liste d'objets. Super facile.

var origins= (from po in db.PermitOrigins where po.PermitID == thisPermit.PermitID select po).ToList();
db.PermitOrigins.RemoveRange(origins);
db.SaveChanges();
0
Jarrette