Un metodo per gestire l'aggiornamento delle liste in modalità disconnessa con Entity Framework

di Stefano Mostarda, in LINQ, Entity Framework,

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

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi