使用Linq在两个列表上左外部联接

时间:2019-06-20 13:43:59

标签: c# linq collections ado.net left-join

我有两个对象。

    public class MIMFeedRedeemedGuestUser
{
    public string Id { get; set; }

    private string _mail;
    public string mail { get { return _mail; } set { _mail = value.ToLower(); } }
}

    public class ExtranetUser
{
    public byte[] objectGUID { get; set; }
    public string sAMAccountName { get; set; }
    public string givenName { get; set; }
    public string sn { get; set; }
    public string displayName { get; set; }
    public string telephoneNumber { get; set; }
    public string extensionAttribute1 { get; set; }
    public string extensionAttribute5 { get; set; }
    public string extensionAttribute8 { get; set; }
    public int userAccountControl { get; set; }
    public bool isEnabled { get; set; }

    private string _mail;
    public string mail { get { return _mail; } set { _mail = value.ToLower(); } }

    public string inviteId { get; set; }
    public string AzureObjectId { get; set; }

}

在我的控制台应用程序中,我有一些代码可以生成这两种类型的列表。

            // Get a list of guest users who have redeemed their invites.
        List<MIMFeedRedeemedGuestUser> RedeemedGuestUserList = GetRedeemedGuestUserListFromSQL();


        // Get a list of all visible users from the SCIM provision OU in extranet AD.
        List<ExtranetUser> SCIMProvADUserList;
        using (DALExtranetAD _ad = new DALExtranetAD())
        {
            SCIMProvADUserList = _ad.GetSCIMProvUsers();
        }

现在请注意,两个对象都具有“邮件”字段/属性。邮件值将是唯一的。我想进行左联接,所以我可以看到列表中的哪个“邮件”没有出现在列表中,反之亦然。在SQL中,我将执行LEFT OUTER JOIN之类的操作,然后在右表中检查是否为空值。我们如何用C#在Linq中做到这一点?

我查找了Enumerable.GroupJoin(),但是不确定是否正是我所需要的。

这是我的尝试,但这对我不起作用。我在互联网上看到的示例也是标准linq格式。我更喜欢以方法格式查看它。这是我的尝试。

            var set = SCIMProvADUserList.GroupJoin(RedeemedGuestUserList, u => u.mail, s => s.mail,
            (u, s) => new
            {
                mailinExtranet = u.mail,
                samaccountname = u.sAMAccountName,
                azureId = s.Select(p=>p.Id),
                mailinAzure = s.Select(p=>p.mail)
            }); 

当我检查集合时,我看到了列表中的所有元素,但没有看到任何mailinAzure属性值。它只是说null。甚至应该有一个匹配项。

0 个答案:

没有答案
相关问题