使用每列中的两列比较两个数据表,并返回不匹配记录的列表

时间:2019-01-14 22:12:46

标签: c# linq

我已经掌握了使用单个列比较两个数据表的语法,但是我仍然停留在如何使用两个列比较两个数据表的语法上。

IEnumerable<string> assocInAD = dtAssoc.AsEnumerable().Select(row => (string)row["parent_guid"] + " " + (string)row["child_guid"]);
IEnumerable<string> assocInDB = dtAssocData.AsEnumerable().Select(row => (string)row["parent_guid"] + " " + (string)row["child_guid"]);
IEnumerable<string> assocNotinAD = assocInAD.Except(assocInDB);

我尝试了这个,但是我得到了所有的东西,而不仅仅是不匹配的记录。

为清楚起见,我正在编写一个程序,该程序使用Active Directory用户,组以及它们之间的关联(包括组之间的关联)更新Oracle数据库。我的初始人口减少了,所有添加或删除的内容都减少了,但是当用户或组从组中删除时,我正在努力管理的是。我已经从Oracle DB和Active Directory中用相关数据填充了两个数据表(带有父GUID和子GUID的两个列数据表),现在我需要查找两者之间的差异。我已经比较了一个值向下拍,但是我比较两个值。

1 个答案:

答案 0 :(得分:0)

我认为GroupJoin将达到目的:

var assocInAD = 
    dtAssoc
    .AsEnumerable()
    .Select(row => new
    {
        ParentGuid = (string)row["parent_guid"],
        ChildGuid = (string)row["child_guid"]
    });

var assocInDB = 
    dtAssocData
    .AsEnumerable()
    .Select(row => new
    {
        ParentGuid = (string)row["parent_guid"],
        ChildGuid = (string)row["child_guid"]
    });

var missingInDB =
    assocInAD
    .GroupJoin(
        assocInDB,
        left => (left.ParentGuid, left.ChildGuid),
        right => (right.ParentGuid, right.ChildGuid),
        (left, right) => (left, right))
    .Where(x => !x.right.Any())
    .Select(x => x.left);

var missingInAD =
    assocInDB
    .GroupJoin(
        assocInAD,
        left => (left.ParentGuid, left.ChildGuid),
        right => (right.ParentGuid, right.ChildGuid),
        (left, right) => (left, right))
    .Where(x => !x.right.Any())
    .Select(x => x.left);