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)
那么,错误在哪里?非常感谢你的所有答案.:)
您可以尝试以下代码......
table1.AsEnumerable().Where(
r =>!table2.AsEnumerable().Select(x=>x["ID"]).ToList().Contains(r["ID"])).ToList();
Run Code Online (Sandbox Code Playgroud)
我刚刚完成了这个并希望分享我的发现.对于我的应用程序,它是一个数据同步机制,但我想你会看到这是如何适用于原始问题.
在我的情况下,我有一个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在合并几种不同的方式后进行了比较