wake-up-neo.com

Massenlöschung in LINQ to Entities

Gibt es eine Möglichkeit, mehrere Objekte, die mit einer bestimmten Abfrage in LINQ oder LINQ-to-Entities übereinstimmen, massenhaft zu löschen? Die einzigen Referenzen, die ich finden kann, sind veraltet und es scheint dumm zu sein, alle Objekte, die ich entfernen möchte, zu durchlaufen und manuell zu löschen.

79

Die Frage ist eine alte (vor EF5 existierte). Für alle, die EF5 verwenden, erledigt EntityFramework.Extended dies im Handumdrehen.

29
Shaul Behr

Vor einiger Zeit schrieb ich eine 4-teilige Blog-Serie (Parts 1 , 2 , 3 und 4 ), in der Bulk-Updates (mit einem Befehl) im Entity Framework behandelt wurden.

Während der Fokus dieser Serie auf dem Update lag, konnten Sie definitiv die beteiligten Prinzipien zum Löschen verwenden.

Du solltest also so etwas schreiben können:

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

query.Delete();

Sie müssen nur die Erweiterungsmethode Delete () implementieren. In der Post-Serie finden Sie Hinweise, wie ...

Hoffe das hilft

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

Die Antworten, die ich hier sehe, sind Linq to Sql

DeleteAllOnSubmit ist Teil von System.Data.Linq und ITable, was Linq to Sql ist

Dies ist mit Entity Framework nicht möglich.

Nachdem ich all das gesagt habe, habe ich noch keine Lösung, werde aber später zurückschicken

6
Phil Strong

Für diejenigen, die EF6 verwenden und eine SQL-Abfrage zum Löschen ausführen möchten:

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

Ich kenne die DeleteAllOnSubmit - Methode eines beliebigen Datenkontexts, der alle Datensätze in der Abfrage löscht. Es muss eine Optimierung zugrunde liegen, da viele Objekte gelöscht werden. Ich bin mir allerdings nicht sicher.

2
Hemant

Ich bin nicht sicher, wie effizient es sein würde, aber Sie könnten so etwas versuchen:

// 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

Ich würde so etwas machen:

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();
    }
}   

Ich glaube nicht, dass es eine Möglichkeit gibt, dies ohne Schleife zu tun, da Entity Framework mit Entitäten zusammenarbeitet und meistens bedeutet dies eine Sammlung von Objekten.

1
G Jeny Ramirez

Sie könnten eine gespeicherte Prozedur schreiben, die das Löschen vornimmt, und es von LINQ aus aufrufen. Ein satzbasierter Löschvorgang ist insgesamt wahrscheinlich schneller, wenn jedoch zu viele Datensätze betroffen sind, kann dies zu Sperrproblemen führen. Möglicherweise müssen Sie mehrere Sätze von Datensätzen durchlaufen (möglicherweise 2000 auf einmal, die Größe hängt von Ihrem Datenbankentwurf ab Startplatz, wenn Sie feststellen, dass das set-based delte so lange dauert, dass es die andere Verwendung der Tabelle beeinflusst). 

1
HLGEM

In diesem Beispiel bekomme ich die zu löschenden Datensätze, und füge sie nacheinander an die Ergebnismenge an und fordere sie auf, sie zu entfernen. Dann habe ich 1 Änderungen gespeichert.

    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

Das Löschen von Daten über Entity Framework erfordert die Verwendung der DeleteObject-Methode. Sie können diese Methode in der EntityCollection der zu löschenden Entitätsklasse oder im abgeleiteten ObjectContext aufrufen. Hier ist ein einfaches Beispiel:

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));

dies ist die schnellste Methode zum Löschen eines Datensatzes aus der Datenbank mithilfe von EF 

1
Anurag Deokar

RemoveRange wurde in EF6 eingeführt und kann eine Liste von Objekten entfernen. Super einfach.

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