比较两个DataTable并选择第二个表中不存在的行

我有两个DataTables,我想从第一个中选择第二个不存在的行

例如:

表A id列1 data1 2 data2 3 data3 4 data4表B id列1 data10 3 data30 

我希望结果如下:

表C.
   id列
   2数据2
   4数据4

你可以使用Linq,特别是Enumerable.Except有助于在TableA中查找不在TableB中的id:

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

您也可以使用Where但效率较低:

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

我得到了一个没有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

您可以使用Linq Enumerable.Except Method函数来获取两个DataTable之间的差异。在这里我使用firstDt和secondDt,记住两个Dt具有相同的结构。

  var EntriesNotInB = firstDt.AsEnumerable().Select(r => r.Field("abc")).Except(secondDt.AsEnumerable().Select(r => r.Field("abc"))); if (EntriesNotInB.Count() > 0) { DataTable dt = (from row in firstDt.AsEnumerable()join id in EntriesNotInB on row.Field("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

和它完成!!!! 快乐的编码………