Frage Massenlöschung in LINQ zu Entitäten


Gibt es eine Möglichkeit, mehrere Objekte, die einer bestimmten Abfrage entsprechen, in LINQ oder LINQ to Entities zu löschen? Die einzigen Referenzen, die ich finden kann, sind veraltet, und es scheint albern zu sein, alle Objekte, die ich entfernen möchte, zu iterieren und manuell zu löschen.


76
2018-05-15 15:02


Ursprung


Antworten:


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


28
2017-11-22 15:17



Vor einer Weile schrieb ich eine vierteilige Blogserie (Parts 1, 2, 3 und 4) abdecken, die Bulk-Updates (mit einem Befehl) im Entity Framework durchführen.

Während der Fokus dieser Serie war Update, könnten Sie definitiv die beteiligten Prinzipien verwenden, um zu löschen.

Du solltest also in der Lage sein, so etwas zu schreiben:

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

query.Delete();

Alles, was Sie tun müssen, ist die Delete () - Erweiterungsmethode zu implementieren. In der Postserie finden Sie Hinweise dazu, wie ...

Hoffe das hilft


54
2018-05-15 17:59



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

38
2017-07-07 16:07



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

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

Dies ist mit Entity Framework nicht möglich.

Nachdem ich all das gesagt habe, habe ich noch keine Lösung, werde aber zurückschreiben, wenn ich es tue


6
2018-03-30 18:57



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
2017-07-08 08:15



Ich weiß von LöschenAllOnSubmit Methode eines Datenkontextes, der alle Datensätze in der Abfrage löscht. Es muss eine Optimierung vorhanden sein, da viele Objekte gelöscht werden. Ich bin mir allerdings nicht sicher.


3
2018-05-15 15:07



Ich bin mir nicht sicher, wie effizient es wäre, aber Sie könnten so etwas ausprobieren:

// 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
2018-05-15 15:14



Sie könnten einen gespeicherten Proc schreiben, der das Löschen durchführt und von LINQ aus aufruft. Ein set-basiertes Löschen ist wahrscheinlich insgesamt schneller, aber wenn es zu viele Datensätze betrifft, können Locking-Probleme auftreten und Sie benötigen möglicherweise eine Mischung aus mehreren Sätzen von Datensätzen (möglicherweise 2000), hängt jedoch vom Datenbankdesign ab Startplatz, wenn Sie feststellen, dass das Set-basierte Delte so lange dauert, bis es die andere Verwendung der Tabelle beeinflusst), um das Löschen durchzuführen.


1
2018-05-15 17:28



Das Löschen von Daten über das Entity Framework basiert auf der DeleteObject-Methode. Sie können diese Methode in der EntityCollection für die zu löschende 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
2017-11-11 23:12



Ich würde etwas tun wie:

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 einen Weg gibt, dies ohne eine Schleife zu tun, da Entity Framework mit Entitäten arbeitet und meistens die Sammlung von Objekten bedeutet.


1
2017-09-19 19:56