lunedì 11 maggio 2015

Linq Compare two DataTables to determine rows change

Il frammento di codice qui di seguito, illustra una tecnica che dati due oggetti di tipo DataTable, rileva quali record sono stati modificati.

La query ritorna i Datarow contenente i record modificati.


Datatable1 (quello con i dati originali)
 DataTable DatiOriginale = GetDati()

                 DataColumn[] PrimaryKeyColumns  = new DataColumn[1];
                 PrimaryKeyColumns[0] = DatiOriginale .Columns["ID"];
                 DatiOriginale .PrimaryKey = PrimaryKeyColumns;


DataTable2 (quello con i dati modificati)
DataTable DatiModificati = GetDati();
  DataColumn[] PrimaryKeyColumns = new DataColumn[1];
                PrimaryKeyColumns[0] = DatiModificati .Columns["ID"];
                DatiModificati .PrimaryKey = PrimaryKeyColumns;


Query Linq

 List changed = (from r1 in DatiOriginale .AsEnumerable()
                                          from r2 in DatiModificati .AsEnumerable()
                                          where DatiOriginale.PrimaryKey.Aggregate(true, (same, keycol) => same & r1[keycol].Equals(r2[keycol.Ordinal]))
                                           && !r1.ItemArray.SequenceEqual(r2.ItemArray)
                                          select r2).ToList();

Nessun commento: