2013-03-29 146 views
13

我有兩個數據表中的行和我想選擇從第一個,其不存在於第二個比較兩個數據表,並選擇不存在於第二個表

例如行:

 
Table A 
    id column 
    1  data1 
    2  data2 
    3  data3 
    4  data4 

Table B 
    id column 
    1  data10 
    3  data30 

我想要得到的結果是:

 
Table C 
    id column 
    2  data2 
    4  data4 
+0

你的代碼到目前爲止看起來如何? – apomene

回答

15

您可以使用LINQ,尤其是Enumerable.Except有助於找到ID在表A不在表B:

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

您還可以使用Where但它會是低效率:

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

非常感謝您的回答。您的解決方案適合我。 – Catalin

2

我有沒有哪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(); 

     } 
    } 
} 

有關詳情,請訪問http://microsoftdotnetsolutions.blogspot.in/2012/12/compare-two-datatables.html

0

您可以使用Linq Enumerable.Except方法功能n在兩個DataTable之間獲得差異在這裏,我使用firstDt和secondDt,記住兩個Dt都具有相同的結構。

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

要了解更多關於Enumerable.Except方法,去http://msdn.microsoft.com/en-us/library/system.linq.enumerable.except(v=vs.110).aspx

和對其做!!!!快樂編碼.........

相關問題