MS Graph - строка запроса LINQ NOT NULL или пустая проблема - PullRequest
0 голосов
/ 01 августа 2020

Как показано ниже, мой Azure Portal правильно отображает значение столбца Source как Windows Server AD для пользователей, которые были перенесены с Windows Active Directory на Azure Active Directory.

Показанные пользователи в Azure Portal :

enter image description here

Now in my WPF app, I am using 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: https://stackoverflow.com/a/936136/1232087
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"
                )
            }
        );

Отображение DataGrid приведенного выше запроса приводит к мое приложение WPF :

Согласно приведенному выше запросу LINQ значения внутри красного должны отображаться как Windows Server AD, потому что OnPremisesUserPrincipalName значение запроса (показанное в столбце On Prem Name ниже) не равно нулю

enter image description here

Question: Why the above LINQ query is returning the Source column value as Azure Active Directory instead of Windows Server AD. This seems to be a LINQ related issue unless I'm missing something here. There are similar LINQ examples здесь и здесь .

1 Ответ

1 голос
/ 01 августа 2020

Порядок, в котором вы проводите свои сравнения по вопросам. Он остановится на первом совпадении, а не на последнем. Поэтому, если вы хотите, чтобы пользователь типа Member без OnPremisesUserPrincipalName выбирал «Windows Server AD», независимо от того, что такое UserPrincipalName, тогда вам нужно переместить эту проверку на первую. Кроме того, поскольку вы уже проверяете наличие «# EXT #» в UserPrincipalName, вам не нужно проверять его снова в следующей строке.

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"
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...