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
Nuova modale riconnessione Blazor
Filtrare i dati in ASP.NET Core usando OpenTelemetry su Azure Monitor
Configurare OpenTelemetry per Application Insights su ASP.NET Core
Gestire progetti .NET + React in .NET Aspire
Utilizzare i command service nei test con .NET Aspire
Gestione dei codeowners in GitHub
Migrare applicazioni legacy nel cloud con Azure App Service Managed Instance
Integrare OpenAI tramite Aspire
Utilizzare ExecuteUpdate per aggiornare colonne JSON in Entity Framework
Esporre un server MCP con Azure API Management
Creare una file based app con C#
Utilizzare il top layer in HTML
I più letti di oggi
- Scopri i nostri nuovi libri su ASP.NET 4.0, C# 4 e Visual Basic 2010: in offerta lancio al 20% di sconto!
- Windows 7 RC per abbonati MSDN e Technet, anche in versione Server
- Windows 7 e Windows Server 2008 R2 RC al download libero
- Utilizzare QuickGrid di Blazor con Entity Framework
- Resi noti i prezzi di Windows 7: in italiano dal 22 ottobre
- Usare Refit e Polly in Blazor per creare client affidabili e fortemente tipizzati
- Visual Studio 2010 e .NET Framework 4.0: beta 2 e data di release RTM
- Generare velocemente pagine CRUD in Blazor con QuickGrid
- Migliorare i tempi di risposta di GPT tramite lo streaming endpoint in ASP.NET Core
- Disponibile la beta 1 del .NET Framework 4.0 e di Visual Studio 2010




