Сравните два набора данных A и B и верните данные только в формате A - PullRequest
0 голосов
/ 29 мая 2018

У меня есть два DataSet A и B в .Net.У D и 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) {от DsA}.

Извините за формат.Я новичок здесь, и я не знаю, как сделать правильный стол.

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Вы можете попробовать использовать 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();
    }
}
0 голосов
/ 29 мая 2018

Вы можете использовать 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();
}
...