C# 获取两个数据表之间的差异?

C# 获取两个数据表之间的差异?,c#,datatable,C#,Datatable,我有以下代码: DataTable before = GetCustomerTable(); FixCustomerAddresses(); DataTable after = GetCustomerTable(); FixCustomerAddresses()方法不会在Customer表中添加或删除任何行。它只是修改某些现有行 我想找出哪些行的列已被修改。有没有一种方法可以通过比较before/after数据表轻松做到这一点?我以前在StackOverflow上看到过这个问题,但这个场景略有

我有以下代码:

DataTable before = GetCustomerTable();
FixCustomerAddresses();
DataTable after = GetCustomerTable();
FixCustomerAddresses()
方法不会在
Customer
表中添加或删除任何行。它只是修改某些现有行

我想找出哪些行的列已被修改。有没有一种方法可以通过比较before/after数据表轻松做到这一点?我以前在StackOverflow上看到过这个问题,但这个场景略有不同,而且建议的解决方案(Merge+GetChanges;
AsEnumerable()。除了
)对我不起作用。生成的
DataTable
要么包含所有行,要么加倍行,要么根本没有行。
DataTable
包含超过35000条记录


FixCustomerAddresses()
只是在数据库上运行一个脚本。没有简单的方法可以确定在该方法中哪些行已更改。DataTable包含主键、一些任意列,当然还有地址字段。

您必须比较所有字段,例如:

var modifiedRows = from beforeRow in before.AsEnumerable()
                   from afterRow in after.AsEnumerable()
                   where beforeRow.Field<int>("Col1") != afterRow.Field<int>("Col1")
                      || beforeRow.Field<string>("Col2") != afterRow.Field<string>("Col2")
                   select beforeRow;
var modifiedRows=from before.AsEnumerable()中的beforeRow
从after.AsEnumerable()中的afterRow开始
此处beforeRow.Field(“Col1”)!=后行字段(“Col1”)
||beforeRow.Field(“Col2”)!=后行字段(“Col2”)
选择beforeRow;

我最终解决这个问题的方法是将数据表导出为csv文件,然后使用(免费)差异库生成更改行的列表,然后将这些行导入另一个数据表。这足够快,可以在客户端上执行所有操作,因此我不需要更改任何数据库脚本。

您可以修改
FixCustomerAddresses()吗
,这样它的副作用是跟踪它正在更新的行。
数据表
编辑了哪些字段以包含所需信息。考虑到大量记录,此解决方案不可行。看起来我可能需要考虑一种完全不同的方法,也许在数据库中做所有的事情,然后输出这些更改。