【问题标题】:Compare two DataSet A and B and return Data only in A比较两个数据集 A 和 B 并仅在 A 中返回数据
【发布时间】:2018-11-07 21:41:05
【问题描述】:

我在 .Net 中有两个数据集 A 和 B。 Ds A 和 B 都有列 ColA 和 ColB。

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

它基本上应该这样做。

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

DsA

(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) {from DsA}。

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

【问题讨论】:

标签: c# .net linq dataset


【解决方案1】:

您可以尝试使用 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();
    }
}

【讨论】:

    【解决方案2】:

    您可以使用 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();
    }
    

    【讨论】:

    • 嗨@Tim Schmelter,感谢您的帮助。我的问题是,我没有任何主键,在两个数据集中进行 Join On 语句。如果您可以查看,我已经更新了我的问题。
    • @LabaNingombam:我的 LINQ 方法不需要主键。你看我加入了这两列
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-27
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多