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

use*_*405 21 c# linq datatable

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

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

Table2
-------------------------
ID  |   Name 
--------------------------
 1  |  A
 2  |  B
--------------------------
Run Code Online (Sandbox Code Playgroud)

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

ResultTable
-------------------------
ID  |   Name 
--------------------------
 3  |  C
--------------------------
Run Code Online (Sandbox Code Playgroud)

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

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

二解决方案:

var dtOne = table1.AsEnumerable();
var dtTwo = table2.AsEnumerable();
var difference = dtOne.Except(dtTwo);
Run Code Online (Sandbox Code Playgroud)

那么,错误在哪里?非常感谢你的所有答案.:)

Amo*_*kar 7

您可以尝试以下代码......

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


Kev*_*rdy 5

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

在我的情况下,我有一个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);
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助.我和他一起战斗了几个小时,在interwebz上找到了很多虚假的线索,最后RowStates在合并几种不同的方式后进行了比较

  • 当我尝试执行此操作时,从GetChanges中获得的所有内容就是集合的并集,而不是区别。 (2认同)