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
Creare una libreria CSS universale - Rotazione degli elementi
Ottimizzare le performance usando Span<T> e il metodo Split
Creare gruppi di client per Event Grid MQTT
Utilizzare il metodo ExceptBy per eseguire operazione di sottrazione tra liste
Aggiornare a .NET 9 su Azure App Service
Ordine e importanza per @layer in CSS
Utilizzare QuickGrid di Blazor con Entity Framework
Utilizzare Azure AI Studio per testare i modelli AI
Conoscere il rendering Server o WebAssembly a runtime in Blazor
Utilizzare il metodo CountBy di LINQ per semplificare raggruppamenti e i conteggi
Configurare il nome della run di un workflow di GitHub in base al contesto di esecuzione
Utilizzare il metodo Index di LINQ per scorrere una lista sapendo anche l'indice dell'elemento