Nello script #489 abiamo visto come utilizzare il lazy loading di Entity Framework tramite l'interfaccia ILazyLoader. Come detto, questa tecnica ci fa scrivere più codice rispetto all'utilizo dei proxy (il che non è necessariamente un male in quanto ci da il pieno controllo sul trigger del laz loading), ma soprattutto lega il nostro modello a Entity Framework e questo puà risultare un problema in alcuni casi.
Per ovviare a questo problema, possiamo iniettare una Action al posto dell'interfaccia ILazyoader; questa action rappresenta la chiamata al metodo Load dell'interfaccia ILazyLoader.
public class Order { private ICollection<Detail> _details; public Order() { } private Order(Action<object, string> lazyLoader) { LazyLoader = lazyLoader; } private Action<object, string> LazyLoader { get; set; } public int Id { get; set; } public DateTime Date { get; set; } public ICollection<Order> Orders { get => LazyLoader.Load(this, ref _orders); set => _orders = value; } } public class Detail { private Order _order; public Detail() { } private Detail(Action<object, string> lazyLoader) { LazyLoader = lazyLoader; } private Action<object, string> LazyLoader { get; set; } public int Id { get; set; } public string Quantity { get; set; } public string UnitCost { get; set; } public Order Order { get => LazyLoader.Load(this, ref _order); set => _order = value; } } public static class PocoLoadingExtensions { public static T Load<T>(this Action<object, string> loader, object entity, ref T navigationField, [CallerMemberName] string navigationName = null) where T : class { loader?.Invoke(entity, navigationName); return navigationField; } }
Come si evince dal codice, la action prende il posto dell'interfaccia e viene invocata nel getter delle navigation property rendendo il codice molto simile a quello utilizzato con ILazyLoader. Tuttavia la classe Action non ha un metodo Load; questo è un extension method che si occupa di recuperare il nome della navigation property e di invocare la action tornandone il risultato così da rendere meno ripetitivo il codice.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Installare le Web App site extension tramite una pipeline di Azure DevOps
Potenziare Azure AI Search con la ricerca vettoriale
Come migrare da una form non tipizzata a una form tipizzata in Angular
Eseguire una ricerca avanzata per recuperare le issue di GitHub
Supporto ai tipi DateOnly e TimeOnly in Entity Framework Core
Ottimizzare la latenza in Blazor 8 tramite InteractiveAuto render mode
Ordinare randomicamente una lista in C#
Routing statico e PreRendering in una Blazor Web App
Sfruttare MQTT in cloud e in edge con Azure Event Grid
Paginare i risultati con QuickGrid in Blazor
Eseguire query manipolando le liste contenute in un oggetto mappato verso una colonna JSON
Utilizzare il nuovo modello GPT-4o con Azure OpenAI
I più letti di oggi
- Utilizzare il metodo CountBy di LINQ per semplificare raggruppamenti e i conteggi
- Eseguire script pre e post esecuzione di un workflow di GitHub
- Ballmer inizia la keynote parlando del momento attuale. https://aspit.co/build-13 #bldwin
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Ottimizzare la persistenza che coinvolge un solo oggetto con #entityframework Core 7 https://aspit.co/cey di @sm15455