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 Graph 在 DataGrid
中显示相同的列表。但是下面的 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"
)
如下所示,对于从 Windows Active Directory
迁移到 Azure Active Directory
的用户,我的 Azure Portal
正确地将 Source
列值显示为 Windows Server AD
.
Azure 门户中显示的用户:
现在在我的 WPF
应用程序中,我使用 Microsoft Graph 在 DataGrid
中显示相同的列表。但是下面的 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"
)