ExecuteUpdate statt Laden und Speichern

ExecuteUpdate statt Laden und Speichern

- Matt

Der klassische Weg lädt alles in den Speicher, nur um ein Feld zu setzen:

var alte = await ctx.Rechnungen.Where(r => r.Datum < grenze).ToListAsync();
foreach (var r in alte) r.Archiviert = true;
await ctx.SaveChangesAsync();

Seit EF Core 7 geht das als ein einziges Statement:

await ctx.Rechnungen
    .Where(r => r.Datum < grenze)
    .ExecuteUpdateAsync(s => s.SetProperty(r => r.Archiviert, true));

Bei 80.000 Zeilen war das bei mir der Unterschied zwischen 40 Sekunden und 200 Millisekunden.

Der Haken: Der Change Tracker bekommt davon nichts mit. Objekte, die schon geladen sind, tragen danach veraltete Werte.