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
Usare le collection expression per inizializzare una lista di oggetti in C#
Trasformare qualsiasi backend in un servizio GraphQL con Azure API Management
Utilizzare il trigger SQL con le Azure Function
Evitare la command injection in un workflow di GitHub
Personalizzare l'errore del rate limiting middleware in ASP.NET Core
Gestire i null nelle reactive form tipizzate di Angular
Effettuare delete massive con Entity Framework Core 7
Ottimizzazione dei block template in Angular 17
Usare Refit e Polly in Blazor per creare client affidabili e fortemente tipizzati
Reactive form tipizzati con modellazione del FormBuilder in Angular
Gestire domini wildcard in Azure Container Apps
Potenziare Azure AI Search con la ricerca vettoriale
I più letti di oggi
- Riordinare le righe di una GridView di ASP.NET con jQuery
- Creazione di un alarm con suono personalizzato con Windows Phone 7.1
- Utilizzare la session affinity con Azure Container Apps
- Blue-green deployment con Azure Web App e DevOps
- Ed infine anche il calendario :)
- Configurare la diagnostica di Azure attraverso Visual Studio
- Recuperare la data di creazione di un tag tramite una pipeline YAML di Azure DevOps
- Microsoft Security Bulletin MS05-002
- .NET Core e dispositivi IoT
- Eseguire attività pianificate con Azure Container Jobs