Uno dei task più ricorrenti quando si lavora con un Entity Framework è quello di dover recuperare una serie di entity a partire da una lista di id. Questo in LINQ si traduce nell'avere una variabile con la lista di id che all'interno del metodo Where viene usata insieme a Contains.
int[] ids = [1,2,3,4,5] var people = await ctx.People .Where(c => ids.Contains(c.Id)) .ToListAsync()
Sebbene questo codice sia perfettamente funzionante, la sua traduzione in SQL non è stata ottimale fino alla versione 7. Infatti fino a quella versione il codice veniva tradotto nel sequente codice SQL (semplificato).
SELECT * FROM People WHERE Id IN (1,2,3,4,5)
Come possiamo vedere, la lista di id è stampata nel codice SQL generato e quindi ogni volta che cambiano gli id, SQL Server genera un nuovo query plan e lo mette in cache causando potenziali problemi di performance perchè altre query vengono eliminate dalla cache.
Con la versione 8, per ovviare a questo problema, il team ha sfruttato le potenzialità di JSON e ha modificato il codice SQL generato nel seguente.
SELECT * FROM People WHERE Id IN ( SELECT value FROM OPENJSON(@__ids_0) WITH ([value] int '$') )
Come si vede, la clausola IN non contiene più la lista di valori da cercare. Questa è viene tradotta in JSON e caricata in una tabella in memoria tramite la funzione OPENJSON. Grazie a questa nuova traduzione, il codice SQL rimane sempre lo stesso a prescindere dagli id usati e così ottimizza le performance deldatabase.
Questo script mostra il codice SQL generato per Sql Server. Tuttavia, questa modifica è stata fatta prima a livello core di EF, e poi a livello di provider per SQL. Questo significa che chi crea i provider per altri database, può sfruttare le modifiche al core per generare un SQL ottimizzato per lo specifico database.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Migliorare l'organizzazione delle risorse con Azure Policy
Potenziare la ricerca su Cosmos DB con Full Text Search
Utilizzare il metodo IntersectBy per eseguire l'intersection di due liste
Gestire il routing HTTP in Azure Container App
Gestione dei nomi con le regole @layer in CSS
Gestire gli accessi con Token su Azure Container Registry
Centralizzare gli endpoint AI Foundry con Azure API Management
Testare il failover sulle region in Azure Storage
Utilizzare WhenEach per processare i risultati di una lista di task
Ridurre il reflow cambiando il CSS
Loggare le query più lente con Entity Framework
Combinare Container Queries e Media Queries
I più letti di oggi
- disponibile il nuovo #adsdk per #win8. doc su https://aspit.co/ad3 donwload diretto da https://aspit.co/ad4
- Niente .NET sui server: siamo Microsoft
- Develop and distribute Azure Functions using K8s and CI/CD
- Documentare i servizi REST con Swagger e OpenAPI con .NET 9
- Impersonation di utente per l'esecuzione di codice in una pagina ASP.NET
- Solo 5 minuti all'inizio della keynote!! http://aspitalia.com/build-win8 #BldWin
- #MIX10: Windows Phone - demo Hush Hush, un diario con interfaccia completamente personalizzata