Molto spesso nelle nostre applicazioni abbiamo la necessità di eseguire più query in un unico comando (un comando può essere una richiesta web o il click di un pulsante in un'applicazione desktop). Se le query sono dipendenti tra loro (ad esempio, la prima query tira fuori alcuni clienti e la seconda tira fuori i primi 5 ordini dei clienti precedenteente trovati), dobbiamo eseguirle in sequenza, ma se le query sono indipendenti (ad esempio la prima query torna i primi 10 clienti per fatturato e la seconda i primi 10 ordini per importo) possiamo eseguirle in modo disgiunto.
Entity Framework Core può andare in errore nel caso si eseguano query in parallelo, quindi dobbiamo seguire un altro approccio. Da diversi anni esiste la libreria Entity Framework Plus che aggiunge diverse funzionalità sia ad Entity Framework che a Entity Framework Core. Tra queste funzionalità una di quelle più comode sono i Future. Grazie ai Future possiamo specificare più query senza eseguirle. Non appena cerchiamo di enumerare il risultato di una di queste query, queste vengono tutte eseguite in un unico comando.
Il package si chiama Z.EntityFramework.Plus.EFCore ed è installabile o attraverso la finestra di NuGet, o aggiungendo la seguente voce al file di progetto.
<ItemGroup> <PackageReference Include="Z.EntityFramework.Plus.EFCore" Version="3.0.60" /> </ItemGroup>
Una volta installato il package, possiamo specificare le query da trasformare in future.
var clientiFuture = Context.Clienti.Where(c => c.City == "Roma").Future(); var ordiniFuture = Context.Ordini.OrderBy(c => c.TotalAmount).Take(10).Future(); var clienti = await clientiFuture.ToListAsync(); var ordini = await ordiniFuture.ToListAsync();
Nelle prime due righe, vengono specificate due query ma non vengono eseguite, bensì vengono trasformate in Future. Quando a riga 3 vengono enumerati i clienti, tutte le query trasformate in Future vengono eseguite in un singolo comando. Questo significa che sia clienti che ordini vengono recuperati in un colpo solo e che quindi l'enumerazione a riga 4 non causa una nuova query. Per verificare che le query vengano eseguite in batch, basta o usare un profiler del database o inviare in output i comandi SQL generati da Entity Framework Core.
Il grande vantaggio di usare questa tecnica è che eseguendo le query con un solo roundtrip al database, si ottimizza la comunicazione con quest'ultimo ottimizzando di conseguenza le prestazioni dell'applicazione.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Gestione dei nomi con le regole @layer in CSS
Usare le navigation property in QuickGrid di Blazor
Utilizzare gRPC su App Service di Azure
Aprire una finestra di dialogo per selezionare una directory in WPF e .NET 8
Gestire i dati con Azure Cosmos DB Data Explorer
Utilizzare Tailwind CSS all'interno di React: installazione
Generare velocemente pagine CRUD in Blazor con QuickGrid
Eseguire attività pianificate con Azure Container Jobs
Utilizzare politiche di resiliency con Azure Container App
Utilizzare il trigger SQL con le Azure Function
Installare le Web App site extension tramite una pipeline di Azure DevOps
Sfruttare i KeyedService in un'applicazione Blazor in .NET 8
I più letti di oggi
- Centrare elementi in HTML tramite CSS
- Proteggere le risorse Azure con private link e private endpoints
- Utilizzare EF.Constant per evitare la parametrizzazione di query SQL
- Referenziare un @layer più alto in CSS
- Gestire i dati con Azure Cosmos DB Data Explorer
- Inference di dati strutturati da testo con Semantic Kernel e ASP.NET Core Web API