2013-03-29 33 views

Trả lời

15

Bạn có thể sử dụng LINQ, đặc biệt là Enumerable.Except giúp tìm id trong TableA mà không phải là trong TableB:

012.
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(); 

Bạn cũng có thể sử dụng Where nhưng nó sẽ ít hiệu quả:

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

Cảm ơn bạn rất nhiều vì câu trả lời của bạn. Giải pháp của bạn hoạt động hoàn hảo cho tôi. – Catalin

2

tôi nhận được một giải pháp mà hoạt động mà không LINQ:

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(); 

     } 
    } 
} 

Để biết thêm Visit http://microsoftdotnetsolutions.blogspot.in/2012/12/compare-two-datatables.html

0

Bạn có thể sử dụng LINQ Enumerable.Except Phương thức functio n để có được sự khác biệt giữa hai DataTable của Ở đây tôi sử dụng firstDt và secondDt, hãy nhớ cả hai Dt có cấu trúc tương tự.

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 
      } 
     } 

Để đọc thêm về Enumerable.Except Method, Tới http://msdn.microsoft.com/en-us/library/system.linq.enumerable.except(v=vs.110).aspx

và Done của nó !!!! Happy Coding .........

Các vấn đề liên quan