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.