我在.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}。
抱歉格式化。我是新来的,我不知道如何制作一张合适的桌子。
答案 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();
}
}