Quando lavoriamo con Entity Framework in modalità disconnessa, spesso ci capita di dover aggiornare un grafo di entità complesso (ad esempio un ordine con i suoi dettagli). In questi casi potremmo dover aggiungere, modificare o cancellare i dettagli dell'ordine. In questo script creiamo un metodo generico che permette di gestire questi dati in maniera semplice. Il metodo accetta in input la lista dei dati provenienti dal database, la lista dei dati in input al metodo e una serie di delegati che ci permettono di decidere se due entità sono uguali o meno e cosa fare quando una entity viene modificata, aggiunta o eliminata. Il codice del metodo è visibile nell'esempio qui riportato.
private void AggiornaListe<T>(ICollection<T> listaDaAggiornare, ICollection<T> listaDB, Func<T, T, bool> comparer, Action<T, T> updateSetter, Action<T> addSetter, Action<T> deleteSetter) where T : class { for (var i = 0; i < listaDaAggiornare.Count; i++) { var found = false; for (var j = 0; j < listaDB.Count; j++) { { if (comparer(listaDaAggiornare.ElementAt(i), listaDB.ElementAt(j))) { updateSetter(listaDaAggiornare.ElementAt(i), listaDB.ElementAt(j)); found = true; } } if (!found) { addSetter(listaDaAggiornare.ElementAt(i)); } } for (var i = 0; i < listaDB.Count; i++) { var found = false; for (var j = 0; j < listaDaAggiornare.Count; j++) { if (comparer(listaDaAggiornare.ElementAt(j), listaDB.ElementAt(i))) { found = true; } } if (!found) { deleteSetter(listaDB.ElementAt(i)); } } }
Il metodo è molto lungo ma tutt'altro che complicato.
La prima parte scorre la lista degli oggetti da aggiornare e quella degli oggetti nel db. Per ogni oggetto di entrambe le liste viene chiamato un delegato che ci dice se gli oggetti sono uguali (sta a noi scrivere questo delegato). Se gli oggetti sono uguali viene chiamato un delegato che decide cosa fare (ad esempio controlla se ci sono modifiche tra i dati ed eventualmente mette l'entità in stato di modificata). Se nessun oggetto viene trovato uguale, allora l'entità nella lista da aggiornare deve essere aggiunta al database e quindi viene invocato l'apposito delegato.
La seconda parte esegue un ciclo al contrario ovvero scorre gli oggetti nel database e se non trova una corrispondenza con gli oggetti da aggiornare allora invoca il delegato di cancellazione.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Utilizzare gli snapshot con Azure File shares
Le novità di Angular: i miglioramenti alla CLI
Utilizzare le Cache API di JavaScript per salvare elementi nella cache del browser
Filtrare e rimuovere gli elementi dalla cache del browser tramite le API JavaScript
Usare le variabili per personalizzare gli stili CSS
Utilizzare un service principal per accedere a Azure Container Registry
Recuperare un elemento inserito nella cache del browser tramite API JavaScript
Sostituire la GitHub Action di login su private registry
Short-circuiting della Pipeline in ASP.NET Core
Code scanning e advanced security con Azure DevOps
Applicare il versioning ai nostri endpoint ASP.NET Core Minimal API
Supportare il sorting di dati tabellari in Blazor con QuickGrid
I più letti di oggi
- Ottimizzare le performance delle collection con le classi FrozenSet e FrozenDictionary
- Utilizzare il trigger SQL con le Azure Function
- Disabilitare automaticamente un workflow di GitHub (parte 2)
- Ottimizzazione dei block template in Angular 17
- Paginare i risultati con QuickGrid in Blazor
- Ed infine anche il calendario :)
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!