392 Stimmen

Wie kann ich mehrere Zeilen in Entity Framework löschen (ohne foreach)

Ich lösche mehrere Elemente aus einer Tabelle mit Entity Framework. Es gibt keinen Fremdschlüssel / übergeordnetes Objekt, so dass ich dies nicht mit OnDeleteCascade behandeln kann.

Im Moment mache ich das:

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

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

Es funktioniert, aber das foreach stört mich. Ich verwende EF4, aber ich möchte kein SQL ausführen. Ich möchte nur sicherstellen, dass ich nichts verpasse - das ist so gut wie es geht, richtig? Ich kann es mit einer Erweiterungsmethode oder einem Helfer abstrahieren, aber irgendwo werden wir immer noch ein foreach ausführen, richtig?

-1voto

 context.Widgets.RemoveRange(context.Widgets.Where(w => w.WidgetId == widgetId).ToList());
                db.SaveChanges();

-1voto

Amarjeet Singh Punkte 47

Wenn Sie Generic Repository verwenden:

Innerhalb des generischen Repository könnte die folgende Methode neu sein.

       public void RemoveMultiple(Expression<Func<T, bool>> predicate)
        {
             IQueryable<T> query = _context.Set<T>().Where(predicate);
             _context.Set<T>().RemoveRange(query.AsNoTracking());

        }

Verwendung:

_unitOfWork.YOUR_ENTITY.RemoveMultiple(x => x.AccountId == accountId);
 _unitOfWork.Complete();

-2voto

Brian Quinn Punkte 47

Siehe die Antwort 'Lieblingsstück des Codes', das funktioniert

Ich habe es folgendermaßen verwendet:

     // Delete all rows from the WebLog table via the EF database context object
    // using a where clause that returns an IEnumerable typed list WebLog class 
    public IEnumerable<WebLog> DeleteAllWebLogEntries()
    {
        IEnumerable<WebLog> myEntities = context.WebLog.Where(e => e.WebLog_ID > 0);
        context.WebLog.RemoveRange(myEntities);
        context.SaveChanges();

        return myEntities;
    }

-3voto

Vladimir Punkte 1199

In EF 6.2 funktioniert dies perfekt, da die Löschung direkt an die Datenbank gesendet wird, ohne die Entitäten vorher zu laden:

context.Widgets.Where(predicate).Delete();

Mit einem festen Prädikat ist das ganz einfach:

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

Und wenn Sie ein dynamisches Prädikat benötigen, schauen Sie unter LINQKit (Nuget-Paket verfügbar), etwas wie dies funktioniert gut in meinem Fall:

Expression<Func<Widget, bool>> predicate = PredicateBuilder.New<Widget>(x => x.UserID == userID);
if (somePropertyValue != null)
{
    predicate = predicate.And(w => w.SomeProperty == somePropertyValue);
}
context.Widgets.Where(predicate).Delete();

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X