C# 基于多列的数据表差异

C# 基于多列的数据表差异,c#,linq,datatable,C#,Linq,Datatable,我试图找出基于多列的两个数据表之间的差异。我根据一个专栏(如下)成功地做到了这一点: //根据列名返回dt1中的所有行,但不返回dt2中的所有行 公共数据表GetTableDiff(数据表dt1、数据表dt2、字符串sColumn) { DataTable dtDiff=新DataTable(); 尝试 { var diff=从dt1中的r1开始。AsEnumerable() 将r2加入dt2.AsEnumerable()中 在r1.Field(sColumn.Trim().ToLower()上

我试图找出基于多列的两个数据表之间的差异。我根据一个专栏(如下)成功地做到了这一点:

//根据列名返回dt1中的所有行,但不返回dt2中的所有行
公共数据表GetTableDiff(数据表dt1、数据表dt2、字符串sColumn)
{
DataTable dtDiff=新DataTable();
尝试
{
var diff=从dt1中的r1开始。AsEnumerable()
将r2加入dt2.AsEnumerable()中
在r1.Field(sColumn.Trim().ToLower()上
等于r2.Field(sColumn).Trim().ToLower()到g
其中!g.Any()//仅获取未从dt2连接行的行
选择r1;
dtDiff=diff.CopyToDataTable();
}
捕获(例外情况除外)
{
}
返回dtDiff;
}

一种方法是使用简单的比较,即:

var diff = from r1 in dt1.AsEnumerable()
     where !dt2.AsEnumerable()
               .Any( r2 => r1.Field<string>("col1") == r2.Field<string>("col1Inr2") ||
                           r1.Field<string>("col2") == r2.Field<string>("col2Inr2"))
     select r1;
var diff=来自dt1.AsEnumerable()中的r1
哪里dt2.AsEnumerable()
.Any(r2=>r1.Field(“col1”)==r2.Field(“col1Inr2”)||
r1.字段(“col2”)==r2.字段(“col2Inr2”))
选择r1;

但是,根据实际需要,您可以使用IEqualityComparer创建更好的方法。对于示例

,您可以创建一个IComparable,并将其与Linq except一起使用。它将是IEqualityComparer。
var diff = from r1 in dt1.AsEnumerable()
     where !dt2.AsEnumerable()
               .Any( r2 => r1.Field<string>("col1") == r2.Field<string>("col1Inr2") ||
                           r1.Field<string>("col2") == r2.Field<string>("col2Inr2"))
     select r1;