Kompilierte Abfragen in EF Core
- Matt
EF Core übersetzt jede LINQ-Abfrage in SQL und legt das Ergebnis in einen Cache. Der Cache-Zugriff selbst kostet aber auch, und bei einer Abfrage, die zehntausendfach pro Minute läuft, wird das messbar.
private static readonly Func<AppDbContext, Guid, Task<Kunde?>> KundeNachId =
EF.CompileAsyncQuery((AppDbContext ctx, Guid id) =>
ctx.Kunden.FirstOrDefault(k => k.Id == id));
var kunde = await KundeNachId(ctx, id);
Bei einem Dienst mit hoher Last waren das rund 20 Prozent weniger Zeit pro Aufruf. Bei allem darunter merkt man nichts.
Einschränkung: Die Abfrage ist damit festgelegt. Bedingtes Zusammenbauen von Filtern funktioniert nicht mehr, weil der Ausdrucksbaum feststehen muss.