LINQ CustomDataRowEqualityComparer
本文关键字:CustomDataRowEqualityComparer LINQ | 更新日期: 2023-09-27 18:04:34
我使用CustomDataRowEqualityComparer()
来比较具有不同列数的2个数据表,但它们共享一些列:
var result= maindatatable.AsEnumerable().Except(dt.AsEnumerable(), new CustomDataRowEqualityComparer()).CopyToDataTable();
如何使结果数据表只包含dt
中的列,在上面的上下文中
result datatable有maindatatable
这是比较器类
public class CustomDataRowEqualityComparer : IEqualityComparer<DataRow>
{
public bool Equals(DataRow x, DataRow y)
{
return ((int)x["id"] == (int)y["id"]);
}
public int GetHashCode(DataRow obj)
{
return ((int)obj["id"]);
}
}
返回dt
中不存在的maindatatable
中的所有行
所以你不知道如何返回dt
中而不是的所有行,但dt
的列的主表。
一般情况下,不能从maintable
中选择行,同时从另一个DataTable
中选择列。因此,必须用这些行填充dt
的新实例(使用dt.Clone()
创建所有列)。
因此,例如(假设表dt
的列也存在于maintable
中,而不是相反):
var result = maindatatable.AsEnumerable()
.Except(dt.AsEnumerable(), new CustomDataRowEqualityComparer());
var dt2 = dt.Clone();
foreach(DataRow mainRow in result)
{
var newRow = dt2.Rows.Add();
foreach (DataColumn col in dt2.Columns)
newRow[col] = mainRow[col.ColumnName];
}