-1

我有这个代码:

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

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

我想弄清楚哪些行的列已被修改。有没有办法通过比较之前/之后的数据表来轻松做到这一点?我以前在 StackOverflow 上看到过这个问题,但这种情况略有不同,并且建议的解决方案(Merge + GetChanges; AsEnumerable().Except)对我不起作用。结果DataTable要么包含所有行,要么包含行的两倍,要么根本不包含行。DataTable包含超过 35000 条记录。

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

4

2 回答 2

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;
于 2013-01-07T12:48:59.820 回答
0

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

于 2013-01-08T14:38:11.797 回答