获得两个数据表之间的区别?

时间:2013-01-07 12:41:35

标签: c# datatable

我有这段代码:

DataTable before = GetCustomerTable();
FixCustomerAddresses();
DataTable after = GetCustomerTable();

FixCustomerAddresses()方法不会在Customer表上添加或删除任何行。它只是修改了某些现有的行。

我想弄清楚哪些行包含已修改过的列。有没有办法通过比较之前/之后的数据表轻松地做到这一点?我之前在StackOverflow上看过这个问题,但是这个场景略有不同,所提出的解决方案(Merge + GetChanges; AsEnumerable().Except)对我不起作用。结果DataTable包含所有行,双行或根本没有行。 DataTable包含超过35000条记录。

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

2 个答案:

答案 0 :(得分:0)

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

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;

答案 1 :(得分:0)

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