我有这段代码:
DataTable before = GetCustomerTable();
FixCustomerAddresses();
DataTable after = GetCustomerTable();
FixCustomerAddresses()
方法不会在Customer
表上添加或删除任何行。它只是修改了某些现有的行。
我想弄清楚哪些行包含已修改过的列。有没有办法通过比较之前/之后的数据表轻松地做到这一点?我之前在StackOverflow上看过这个问题,但是这个场景略有不同,所提出的解决方案(Merge + GetChanges; AsEnumerable().Except
)对我不起作用。结果DataTable
包含所有行,双行或根本没有行。 DataTable
包含超过35000条记录。
FixCustomerAddresses()
只需在DataBase上运行脚本。没有简单的方法可以确定在该方法中哪些行已更改。 DataTable包含主键,几个任意列,当然还有地址字段。
答案 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。这足以在客户端上执行所有操作,因此我无需更改任何数据库脚本。