Molto spesso capita di dover fare query complesse che richiedono join tra molte tabelle. Sebbene LINQ faccia un ottimo lavoro per rendere semplice la scrittura di queste query, ci sono casi in cui l'estrema complessità rende il codice poco leggibile e anche poco performante. In questi casi, una buona soluzione può essere quella di spezzare la query in due o più query più piccole e lasciare che sia Entity Framework a ricomporre i pezzi per noi.
Supponiamo di avere un modollo dove un cliente può piazzare ordini. Ogni ordine ha più dettaglio e per ogni dettaglio abbiamo un prodotto che è preso da un fornitore. Se volessimo fare una query che gli ordini, il cliente, i dettagli con il prodotto associato e il relativo fornitore, dovremmo scrivere una query molto complessa e soprattutto poco performante. Scrivere tutto in una query LINQ e usare il metodo AsSplitQuery può aiutare, ma non è sempre efficace soprattutto quando la query è complessa e vogliamo essere noi a suddividerla in più query senza lasciarlo fare a Entity Framework.
Quello che è importante sapere è che Entity Framework ricostruisce le relazioni tra oggetti anche quando decidiamo di spezzare la query. Riprendendo l'esempio precedente, potremmo fare una query che tira fuori ordini e cliente e un'altra che tira fuori gli altri dati.
var q1 = await ctx.Orders .Include(c => c.Customer) .ToListAsync(); await ctx.OrderDetails .Include(c => c.Product) .ThenInclude(c => c.Supplier) .ToListAsync();
Anche se non abbiamo estratto nella stessa query l'ordine con i suoi dettagli, sfruttando le informazioni sul modello, il change tracking di Entity Framework è in grado di ricostruire di popolare anche le istanze esistenti. Nel codice dell'esempio, dopo la prima query, la proprietà Details degli ordini in q1 è vuota, ma dopo la seconda query, questa è piena anche se non abbiamo fatto una Include esplicita.
Grazie a questo meccanismo, possiamo spezzare le nostre query più complesse e sapere che alla fine gli oggetti saranno correttamente collegati anche senza scrivere codice esplicito.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Generare velocemente pagine CRUD in Blazor con QuickGrid
Aprire una finestra di dialogo per selezionare una directory in WPF e .NET 8
Routing statico e PreRendering in una Blazor Web App
Proteggere le risorse Azure con private link e private endpoints
Usare le navigation property in QuickGrid di Blazor
Disabilitare automaticamente un workflow di GitHub (parte 2)
Garantire la provenienza e l'integrità degli artefatti prodotti su GitHub
Supportare il sorting di dati tabellari in Blazor con QuickGrid
Utilizzare i primary constructor in C#
Hosting di componenti WebAssembly in un'applicazione Blazor static
.NET Conference Italia 2024
Eseguire operazioni sui blob con Azure Storage Actions
I più letti di oggi
- Build 2016: segui con noi in live streaming!
- Build 2017: segui con noi tutte le novità mercoledì 10 e giovedì 11 maggio da Seattle!
- Microsoft Visual Studio Code: un nuovo editor gratuito per Windows, MacOSX e Linux per sviluppatori ASP.NET e Node.js
- Usare gRPC come infrastruttura per i nostri servizi web
- Utilizzare QuickGrid di Blazor con Entity Framework
- Realizzare una Progressive Web Application con Blazor e ASP.NET Core
- Abilitare e gestire il prerendering nelle applicazioni Blazor WebAssembly
- ASP.NET 4.5 e Visual Studio 2012 Live - Online
- Popolare una classe a partire dal testo, con Semantic Kernel e ASP.NET Core Web API
- Gestire la cancellazione di una richiesta in streaming da Blazor