Quando eseguiamo una query tramite Entity Framework, spesso abbiamo l'esigenza di recuperare dati da più entity. Grazie all'espressività di LINQ to Entities e al metodo Include, mettere in relazione più entity è estremamente semplice. Tuttavia quando le entity coinvolte nella query sono tante, la query SQL che viene inviata al database diventa pesante.
In scenari come questi, si possono ottimizzare le prestazioni limitando l'uso della clausola Include ed effettuando più query. L'ovvio svantaggio di questa tecnica è quello di dover eseguire più query, ma spesso questo svantaggio è superato dai vantaggi.
Facciamo un esempio. Supponiamo di dover eseguire una query che estrae gli ordini con i relativi dettagli, il cliente che ha piazzato l'ordine, il dipendente che lo ha inserito e i prodotti presenti nei dettagli. Eseguire in un colpo solo una query simile significa mettere in JOIN molte tabelle sul database il che significa bassa velocità di esecuzione e, soprattutto, un'enorme mole di dati duplicati restituiti dalla query il che aumenta il carico di rete ed il tempo che Entity Framework impiega per trasformari i dati nel database in oggetti.
Se suddividiamo la query in query più piccole otteniamo una maggior velocità di esecuzione ed un minore numero di dati scambiati tra il database e la nostra applicazione. La cosa più importante è che Entity Framework mette comunque in relazione le entity recuperate. Il risultato è che alla fine delle query, gli ordini sono collegati ai clienti, al dipendente, ai dettagli e ai prodotti esattamente come se i dati fossero stati recuperati in una sola query.
Ovviamente, come tutte le ottimizzazioni, questa tecnica non è da applicare sempre; il suo utilizzo va valutato caso per caso misurando le prestazioni sul campo.
//Query lenta var orders = ctx.Orders.Include(o => o.Customer).Include(o => o.Employee).Include(o => o.Details.Select(d => d.Product)); //Ottimizzata ctx.Customers.Load(); ctx.Employees.Load(); var orders = ctx.Orders.Include(o => o.Details.Select(d => d.Product));
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Utilizzare Container Queries nominali
Ottenere un token di accesso per una GitHub App
Ordine e importanza per @layer in CSS
Configurare e gestire sidecar container in Azure App Service
Aggiornare a .NET 9 su Azure App Service
Gestione dell'annidamento delle regole dei layer in CSS
Testare l'invio dei messaggi con Event Hubs Data Explorer
Collegare applicazioni server e client con .NET Aspire
Popolare una classe a partire dal testo, con Semantic Kernel e ASP.NET Core Web API
Controllare la telemetria con .NET Aspire
Utilizzare il metodo Index di LINQ per scorrere una lista sapendo anche l'indice dell'elemento
Utilizzare Hybrid Cache in .NET 9
I più letti di oggi
- Usare i settings di serializzazione/deserializzazione di System.Text.Json di ASP.NET all'interno di un'applicazione non web
- .NET Conference Italia 2025 - Milano
- The Agentic Day - Milano
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Documentare i servizi REST con Swagger e OpenAPI con .NET 9
- Tutorial LINQ
- Gestione ciclo di vita in .NET Aspire