C# LINQ CustomDataRowEqualityComparer

C# LINQ CustomDataRowEqualityComparer,c#,linq,C#,Linq,我使用CustomDataRowEqualityComparer()比较两个列数不同但共享某些列的数据表: var result= maindatatable.AsEnumerable().Except(dt.AsEnumerable(), new CustomDataRowEqualityComparer()).CopyToDataTable(); 如何使结果数据表仅包含上述上下文中dt中的列 结果数据表包含maindatatable 这是我的比较器课 public class Custom

我使用
CustomDataRowEqualityComparer()
比较两个列数不同但共享某些列的数据表:

var result= maindatatable.AsEnumerable().Except(dt.AsEnumerable(), new CustomDataRowEqualityComparer()).CopyToDataTable();
如何使结果数据表仅包含上述上下文中
dt
中的列

结果数据表包含
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"]);
        }

    }
公共类CustomDataRowEqualityComparer:IEqualityComparer
{
公共布尔等于(数据行x、数据行y)
{
返回((int)x[“id”]==(int)y[“id”]);
}
public int GetHashCode(DataRow obj)
{
返回((int)obj[“id”]);
}
}

它返回
maindatable
中不存在于
dt
中的所有行,因此您不知道如何返回主表中不在
dt
中但列为
dt
的所有行

通常,不能从
maintable
中选择行,而从另一个
DataTable
中选择列。因此,您必须用这些行填充
dt
的新实例(使用
dt.Clone()
创建所有列)

例如(假设表
dt
的列也存在于
maintable
中,但反之亦然):


使用
DataTable.Merge
。看看我的自定义实现,它允许在一个命名列上联合表(如您的
id
):我想这也是您想要的。@TimSchmelter不完全是这样,dt中的所有行都存在于主数据表中,在结果数据表中,我想从maindatatable中选择dt中不存在的行,我附加的代码工作正常,但我不知道如何选择我想要的te列
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];
}