MS Graph - LINQ 查询字符串 NOT NULL 或 Empty 问题

MS Graph - LINQ query string NOT NULL or Empty issue

如下所示,对于从 Windows Active Directory 迁移到 Azure Active Directory 的用户,我的 Azure Portal 正确地将 Source 列值显示为 Windows Server AD .

Azure 门户中显示的用户

现在在我的 WPF 应用程序中,我使用 Microsoft GraphDataGrid 中显示相同的列表。但是下面的 LINQ 查询仍然将迁移用户的 Source 列值显示为 Azure Active Directory 而不是 Windows Server AD:

var users = await graphClient.Users
    .Request()
    .Select("displayName, userPrincipalName, onPremisesUserPrincipalName, userType")
    .GetAsync();

List<User> lstUsers = (List<User>)users.CurrentPage.ToList();
//I noticed the following Linq without lambda works better if select case staement have multiple conditions: 
var userslist =
        (
            from User in lstUsers
            select new
            {
                DisplayName = User.DisplayName,
                UserPrincipalName = User.UserPrincipalName,
                OnPremisesUserPrincipalName = User.OnPremisesUserPrincipalName,
                UserType = User.UserType,
                Source =
                (
                    User.UserType == "Member" && !User.UserPrincipalName.Contains("#EXT#") ? "Azure Active Directory" :
                    User.UserType == "Member" && User.UserPrincipalName.Contains("#EXT#") ? "Microsoft Account" :
                    User.UserType == "Guest" && User.ExternalUserState == "Accepted" ? "External Azure Active Directory" :
                    (User.UserType == "Member" && string.IsNullOrEmpty(User.OnPremisesUserPrincipalName) == false) ? "Windows Server AD" :
                    User.UserType == "Guest" && User.ExternalUserState == "PendingAcceptance" ? "Invited user" : "Unknown"
                )
            }
        );

以上查询结果在我的WPF应用中的DataGrid显示:

根据上面的 LINQ 查询,红色内的值应该显示为 Windows Server AD,因为查询的 OnPremisesUserPrincipalName 值(显示在下面的 On Prem Name 列中)不为 null

问题:为什么上述 LINQ 查询将 Source 列值返回为 Azure Active Directory 而不是 Windows Server AD。这似乎是一个与 LINQ 相关的问题,除非我在这里遗漏了什么。还有类似的 LINQ 例子 here and here.

您进行比较的顺序很重要。它会在第一个匹配的而不是最后一个上停止。因此,如果您希望没有 OnPremisesUserPrincipalName 的用户类型 Member 到 select“Windows Server AD”,而不管 UserPrincipalName 是什么,那么您需要将该检查移至第一个.此外,由于您已经在 UserPrincipalName 中检查了“#EXT#”,因此您不必在下一行再次检查它。

Source =
(
    (User.UserType == "Member" && !string.IsNullOrEmpty(User.OnPremisesUserPrincipalName)) 
        ? "Windows Server AD" :
    User.UserType == "Member" && !User.UserPrincipalName.Contains("#EXT#") 
        ? "Azure Active Directory" :
    User.UserType == "Member" 
        ? "Microsoft Account" :
    User.UserType == "Guest" && User.ExternalUserState == "Accepted" 
        ? "External Azure Active Directory" :        
    User.UserType == "Guest" && User.ExternalUserState == "PendingAcceptance" 
        ? "Invited user" : "Unknown"
)