我已经掌握了使用单个列比较两个数据表的语法,但是我仍然停留在如何使用两个列比较两个数据表的语法上。
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的两个列数据表),现在我需要查找两者之间的差异。我已经比较了一个值向下拍,但是我比较两个值。
答案 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);