如何在两个DataTable之间获得差异

我有这两个数据表,我想得到它们之间的区别。 这是一个例子:

Table1 ------------------------- ID | Name -------------------------- 1 | A 2 | B 3 | C -------------------------- Table2 ------------------------- ID | Name -------------------------- 1 | A 2 | B -------------------------- 

我只想将结果作为table1中的数据而不是table2中的数据(table1-table2)

 ResultTable ------------------------- ID | Name -------------------------- 3 | C -------------------------- 

我尝试通过Linq使用这两个类似的解决方案,但它总是返回table1而不是table1-table2。 这是第一个解决方案:

 DataTable table1= ds.Tables["table1"]; DataTable table2= ds.Tables["table2"]; var diff= table1.AsEnumerable().Except(table2.AsEnumerable(),DataRowComparer.Default); 

二解决方案:

 var dtOne = table1.AsEnumerable(); var dtTwo = table2.AsEnumerable(); var difference = dtOne.Except(dtTwo); 

那么,错误在哪里? 非常感谢你的所有答案。 🙂

您可以尝试以下代码……

 table1.AsEnumerable().Where( r =>!table2.AsEnumerable().Select(x=>x["ID"]).ToList().Contains(r["ID"])).ToList(); 

我刚刚完成了这个并希望分享我的发现。 对于我的应用程序,它是一个数据同步机制,但我想你会看到这是如何适用于原始问题。

就我而言,我有一个表示我上次上传数据的DataTable ,以及将来的某个时间,我需要获取数据的当前状态并仅上传差异。

 // get the Current state of the data DataTable dtCurrent = GetCurrentData(); // get the Last uploaded data DataTable dtLast = GetLastUploadData(); dtLast.AcceptChanges(); // the table meant to hold only the differences DataTable dtChanges = null; // merge the Current DataTable into the Last DataTable, // with preserve changes set to TRUE dtLast.Merge(dtCurrent, true); // invoke GetChanges() with DataRowState.Unchanged // !! this is the key !! // the rows with RowState == DataRowState.Unchanged // are the differences between the 2 tables dtChanges = dtLast.GetChanges(DataRowState.Unchanged); 

我希望这有帮助。 我和他一起打了几个小时,在interwebz上找到了很多假引线,最后在合并几种不同的方式后比较了RowStates

我将尝试在列级而不是DataTable上执行此操作。

 IEnumerable id_table1 = table1.AsEnumerable().Select(val=> (int)val["ID"]); IEnumerable id_table2 = table2.AsEnumerable().Select(val=> (int)val["ID"]); IEnumerable id_notinTable1= id_table2.Except(id_table1); 

只需在答案中添加.Select() ……

试试这个

 DataTable dtmismatch = Table1.AsEnumerable().Except(Table2.AsEnumerable(), DataRowComparer.Default).CopyToDataTable(); 

尝试下面,这是非常基本的。 合并两套,并获得差异。 如果套件没有正确对齐,那么这将不起作用。 试着测试一样

 DataSet firstDsData = new DataSet(); DataSet secondDsData = new DataSet(); DataSet finalDsData = new DataSet(); DataSet DifferenceDataSet = new DataSet(); finalDsData.Merge(firstDsData); finalDsData.AcceptChanges(); finalDsData.Merge(secondDsData); DifferenceDataSet = finalDsData.GetChanges(); 

尝试以下方法:

初始化:

 var columnId = new DataColumn("ID", typeof (int)); var columnName = new DataColumn("Name", typeof (string)); var table1 = new DataTable(); table1.Columns.AddRange(new[] {columnId, columnName}); table1.PrimaryKey = new[] {columnId}; table1.Rows.Add(1, "A"); table1.Rows.Add(2, "B"); table1.Rows.Add(3, "C"); var table2 = table1.Clone(); table2.Rows.Add(1, "A"); table2.Rows.Add(2, "B"); table2.Rows.Add(4, "D"); 

解:

 var table3 = table1.Copy(); table3.AcceptChanges(); table3.Merge(table2); var distinctRows = from row in table3.AsEnumerable() where row.RowState != DataRowState.Modified select row; var distintTable = distinctRows.CopyToDataTable(); 

当table2中的新行没有出现在table1中时,上面的解决方案也可以工作。

distintTable CD.

尝试下面,这是非常基本的。 合并两套,并获得差异。 如果套件没有正确对齐,那么这将不起作用。

 DataSet firstDsData = new DataSet(); DataSet secondDsData = new DataSet(); DataSet finalDsData = new DataSet(); DataSet DifferenceDataSet = new DataSet(); finalDsData.Merge(firstDsData); finalDsData.AcceptChanges(); finalDsData.Merge(secondDsData); DifferenceDataSet = finalDsData.GetChanges();