比较两个DataSet A和B并仅在A中返回Data

时间:2018-05-29 09:27:58

标签: c# .net linq dataset

我在.Net中有两个DataSet A和B. Ds A和B在两者中都有Col Col和ColB。

我需要检查B中是否有任何相应的第一行和第二行。它应该只返回A中不在B中的行。

基本上应该这样做。

Not(Select ColA, ColB from DsA [join DsB ? or self join?] 
where DsA.ColA == DsB.ColA and DsA.ColB == DsB.ColB)

减影

(ColA,ColB) - (1, 10), (1, 11), (2, 12), (3,13), (4, 14)

DSB

(ColA,ColB) - (1, 9), (1, 10), (2, 12), (3,15)

查询应返回(1,11),(3,13),(4,14){来自DsA}。

抱歉格式化。我是新来的,我不知道如何制作一张合适的桌子。

2 个答案:

答案 0 :(得分:0)

您可以使用LINQ-LEFT-OUTER-JOIN

var rowsOnlyInA = 
    from a in A.Tables[0].AsEnumerable()
    join b in B.Tables[0].AsEnumerable() 
    on     new{ ColA = a.Field<string>("ColA"), ColB = a.Field<string>("ColB") }
    equals new{ ColA = b.Field<string>("ColA"), ColB = b.Field<string>("ColB") } into ps
    from p in ps.DefaultIfEmpty()
    where p == null
    select a;

if(rowsOnlyInA.Any())
{
   DataTable resulTable = rowsOnlyInA.CopyToDataTable();
}

答案 1 :(得分:0)

您可以尝试使用IEqualityComparer

private static void Find()
{
    var uniqueDataSets = dataSet1.Except(dataSet2, new DataComparer());
}


class DataComparer : IEqualityComparer<DataSet>
{
    public bool Equals(DataSet x, DataSet y)
    {
        if (object.ReferenceEquals(x, y)) return true;

        return x?.ColA == y?.ColA && x?.ColB == y?.ColB;
    }

    public int GetHashCode(DataSet obj)
    {
        if (obj == null) return 0;

        return obj.ColA.GetHashCode() ^ obj.ColB.GetHashCode();
    }
}