2013-03-29 9 views

Antwort

15

Sie können Linq verwenden, vor allem Enumerable.Except hilft ids in TableA zu finden, die nicht in TableB sind:

var idsNotInB = TableA.AsEnumerable().Select(r => r.Field<int>("id")) 
     .Except(TableB.AsEnumerable().Select(r => r.Field<int>("id"))); 
DataTable TableC = (from row in TableA.AsEnumerable() 
        join id in idsNotInB 
        on row.Field<int>("id") equals id 
        select row).CopyToDataTable(); 

Sie können auch Where verwenden, aber es werden weniger effizient:

DataTable TableC = TableA.AsEnumerable() 
    .Where(ra => !TableB.AsEnumerable() 
         .Any(rb => rb.Field<int>("id") == ra.Field<int>("id"))) 
    .CopyToDataTable(); 
+0

Vielen Dank für Ihre Antwort. Deine Lösung funktioniert perfekt für mich. – Catalin

2

ich eine Lösung erhielt, die ohne LINQ funktioniert:

public DataTable CompareDataTables(DataTable first, DataTable second) 
{ 
    first.TableName = "FirstTable"; 
    second.TableName = "SecondTable"; 

    //Create Empty Table 
    DataTable table = new DataTable("Difference"); 

    try 
    { 
     //Must use a Dataset to make use of a DataRelation object 
     using (DataSet ds = new DataSet()) 
     { 
      //Add tables 
      ds.Tables.AddRange(new DataTable[] { first.Copy(), second.Copy() }); 

      //Get Columns for DataRelation 
      DataColumn[] firstcolumns = new DataColumn[ds.Tables[0].Columns.Count]; 

      for (int i = 0; i < firstcolumns.Length; i++) 
      { 
       firstcolumns[i] = ds.Tables[0].Columns[i]; 
      } 

      DataColumn[] secondcolumns = new DataColumn[ds.Tables[1].Columns.Count]; 

      for (int i = 0; i < secondcolumns.Length; i++) 
      { 
       secondcolumns[i] = ds.Tables[1].Columns[i]; 
      } 

      //Create DataRelation 
      DataRelation r = new DataRelation(string.Empty, firstcolumns, secondcolumns, false); 

      ds.Relations.Add(r); 

      //Create columns for return table 
      for (int i = 0; i < first.Columns.Count; i++) 
      { 
       table.Columns.Add(first.Columns[i].ColumnName, first.Columns[i].DataType); 
      } 

      //If First Row not in Second, Add to return table. 
      table.BeginLoadData(); 

      foreach (DataRow parentrow in ds.Tables[0].Rows) 
      { 
       DataRow[] childrows = parentrow.GetChildRows(r); 
       if (childrows == null || childrows.Length == 0) 
        table.LoadDataRow(parentrow.ItemArray, true); 
      } 

      table.EndLoadData(); 

     } 
    } 
} 

Weitere Besuchen http://microsoftdotnetsolutions.blogspot.in/2012/12/compare-two-datatables.html

0

Sie können Linq Enumerable.Except Methode functio verwenden n, um Unterschiede zwischen zwei DataTables zu bekommen. Hier verwende ich firstDt und secondDt, denke daran, dass beide Dts dieselbe Struktur haben.

var EntriesNotInB = firstDt.AsEnumerable().Select(r => r.Field<string>("abc")).Except(secondDt.AsEnumerable().Select(r => r.Field<string>("abc"))); 

     if (EntriesNotInB.Count() > 0) 
     { 
      DataTable dt = (from row in firstDt.AsEnumerable()join id in EntriesNotInB on row.Field<string>("abc") equals id select row).CopyToDataTable(); 
      foreach (DataRow row in dt.Rows) 
      { 
       /////Place your code to manipulate on datatable Rows 
      } 
     } 

Um mehr über Enumerable.Except Methode zu lesen, gehen Sie zu http://msdn.microsoft.com/en-us/library/system.linq.enumerable.except(v=vs.110).aspx

und seine Erledigt !!!! Happy Coding .........