Quando eseguiamo una query LINQ to Entities tramite Entity Framework, una delle operazioni più lente è la compilazione che è il processo di trasformazione di una query LINQ to Entities in un albero di funzioni che verrà poi tradotto in SQL.
Per ottimizzare questo processo, abbiamo a disposizione le Compiled Queries che compilano la query la prima volta, tengono in memoria la versione compilata e poi la riutilizzano. In Entity Framework 5, tutte le query vengono automaticamente compilate senza che noi dobbiamo fare nulla. Questo porta notevoli benefici in termini di performance ma bisogna tenere presente un particolare molto importante: non tute le query vengono mantenute in memoria, ma solo quelle più usate fino a un massimo di 60 (questo limite può variare).
Per mantenere il più alto numero possibile di query compilate in memoria, è possibile con un accorgimento molto semplice. Prendiamo come esempio le seguenti query:
var q = ctx.Cars.Where(c => c.Brand == "FIAT").ToList(); var q = ctx.Cars.Where(c => c.Brand == "AUDI").ToList(); var q = ctx.Cars.Where(c => c.Brand == "BMW").ToList();
In questo caso, poiché il nome del parametro è cablato nella query, avremo tre query in memoria che fanno la stessa cosa. Con un piccolo accorgimento possiamo fare in modo che queste tre query siano siano compilate in memoria come una sola query liberando così due slot per memorizzare altre query. L'accorgimento da usare in questo caso consiste nel parametrizzare il valore che prima era cablato.
var p = "Fiat"; var q = ctx.Cars.Where(c => c.Brand == p).ToList(); p = "AUDI"; var q = ctx.Cars.Where(c => c.Brand == p).ToList(); p = "BMW"; var q = ctx.Cars.Where(c => c.Brand == p).ToList();
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Inizializzare i container in Azure Container Apps
Cambiare la chiave di partizionamento di Azure Cosmos DB
Gestire liste di tipi semplici con Entity Framework Core
Criptare la comunicazione con mTLS in Azure Container Apps
.NET Conference Italia 2023
Registrare servizi multipli tramite chiavi in ASP.NET Core 8
Supportare il sorting di dati tabellari in Blazor con QuickGrid
Generare file per il download da Blazor WebAssembly
Effettuare il deploy di immagini solo da container registry approvati in Kubernetes
Limitare le richieste lato server con l'interactive routing di Blazor 8
Ottimizzare la latenza in Blazor 8 tramite InteractiveAuto render mode
Reactive form tipizzati con FormBuilder in Angular
I più letti di oggi
- Utilizzare WebAssembly con .NET, ovunque
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Ottimizzare le performance delle collection con le classi FrozenSet e FrozenDictionary
- Utilizzare il trigger SQL con le Azure Function
- Disabilitare automaticamente un workflow di GitHub (parte 2)
- Paginare i risultati con QuickGrid in Blazor
- Ottimizzazione dei block template in Angular 17