Le novità del provider LINQ in Entity Framework Core 3

di Stefano Mostarda, in LINQ, Entity Framework,

La novità principale di Entity Framework Core 3 è la completa riscrittura del provider LINQ. Questa riscrittura ha comportato alcuni cambiamenti sulla compilazione e sull'esecuzione della query. Innanzitutto, sono supportati molti più metodi e molti più pattern rispetto alla versione precedente.

Inoltre, è stato modificato il modo di eseguire query che necessitano di una valutazione lato client. Fino alla versione 2.2, se il provider incontra un pattern che non può tradurre in SQL, allora scarica i dati sul client e continua l'esecuzione della query in memoria. Oltre a fare questo, il provider emette un warning che possiamo intercettare per sollevare un'eccezione. Con la nuova versione, il provider solleva direttamente un'eccezione a runtime.

Questo significa che il seguente codice che con la versione 2.2 non genera errori ma scarica tutto in memoria, con la versione 3.0 genera un'eccezione.

var sc = ctx.People
  .Where(c => IsItalian(c));

L'unico caso in cui questo pattern è ancora supportato è nella Select finale di una query.

Un altro cambiamento importante è nel modo di eseguire le query che usano l'eager loading. Fino alla versione 2.2, nei casi in cui si vuole precaricare una lista di entity il provider scompone la query in più query. Questo modo di eseguire la query LINQ ottimizza la banda, ma in alcuni casi causa problemi di 1+n e di incosistenza dei dati.
Per evitare questi problemi con la versione 3.0 del provider si è deciso di cambiare approccio e di fare in modo che ogni query LiNQ generi una sola query sul database utilizzando le JOIN. Nel caso in cui il provider non riesca a tradurre l'intera query LINQ in un comando SQL, il provider genera un'eccezione.

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi