loading experience

Entity Framework Core

EF Core: dieci consigli per query più veloci

Proiezioni, AsNoTracking, query divise e aggiornamenti in blocco: le abitudini che fanno la differenza.

EF Core: dieci consigli per query più veloci

Entity Framework Core è produttivo, ma alcune abitudini possono trasformare una pagina veloce in una lenta. Ecco i consigli che applichiamo in ogni progetto.

Le stesse informazioni, con molto meno lavoro per il database.
Le stesse informazioni, con molto meno lavoro per il database.

1. Leggi solo ciò che serve

var elenco = await db.Prodotti
    .Where(p => p.Attivo)
    .Select(p => new ProdottoRiga(p.Id, p.Nome, p.Prezzo))
    .ToListAsync();

2. AsNoTracking per le letture

Se non devi modificare le entità, AsNoTracking() evita il costo del change tracker.

3. Attenzione al problema N+1

Caricare una lista e poi accedere a una relazione dentro un ciclo genera una query per riga. Usa Include o, meglio, una proiezione che porti con sè i dati correlati.

4. Query divise per più collezioni

Includere più collezioni nella stessa query moltiplica le righe restituite. AsSplitQuery() le carica con query separate.

5. Paginazione sempre lato database

var pagina = await db.Ordini
    .OrderByDescending(o => o.Data)
    .Skip((numero - 1) * dimensione)
    .Take(dimensione)
    .ToListAsync();

6. Aggiornamenti in blocco

await db.Sessioni
    .Where(s => s.Scadenza < DateTime.UtcNow)
    .ExecuteDeleteAsync();

7-10. Le altre abitudini

  • Indici sulle colonne usate in filtri e ordinamenti: nessun ORM compensa un indice mancante.
  • Query compilate per le interrogazioni più frequenti.
  • Pool dei DbContext con AddDbContextPool nelle applicazioni ad alto traffico.
  • Guarda l'SQL generato: ToQueryString() e il logging dei comandi mostrano cosa arriva davvero al database.
Commenti (0)

Nessun commento ancora.

Lascia un commento