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