Запрос роли пользователя с помощью LINQ - PullRequest
2 голосов
/ 28 ноября 2010

Мне нужно создать список всех ролей на веб-сайте ASP.NET, помечая роли, назначенные данному пользователю, т. Е. API ролей позволяет мне получать все роли и роли для пользователя. Я хочу объединить их, чтобы иметь возможность отображать сетку ролей для пользователя, показывая все роли с галочкой на тех, которые назначены пользователю. Как я могу улучшить следующие усилия LINQ to Objects?

public IEnumerable<UserRoleIndicator> GetRoleIndicators(string userName)
{
    // GetRolesForUser and GetAllRoles bith return string[].
    var rolesForUser = _roleProvider.GetRolesForUser(userName)
        .Select(r => new UserRoleIndicator { RoleName = r, InRole = true });
    var rolesNotForUser = _roleProvider.GetAllRoles()
        .Where(r => !rolesForUser.Contains(new UserRoleIndicator { RoleName = r, InRole = true }))
        .Select(r => new UserRoleIndicator { RoleName = r, InRole = false });
    var rolesList = rolesForUser.Union(rolesNotForUser);
    return rolesList;
}

Ответы [ 2 ]

3 голосов
/ 28 ноября 2010
        string[] roles = new string[] { "Admin", "Super", "Normal" };
        string[] userroles = new string[] { "Admin", "Normal" };

        var query = from r in roles
                    join u in userroles on r equals u
                    into temproles
                    from urs in temproles.DefaultIfEmpty()
                    select new UserRoleIndicator { RoleName = r, InRole = r == urs ? true : false };

Попробуйте это, это рабочий код, надеюсь, это поможет вам.

Спасибо

Шакиб Ахмед

2 голосов
/ 28 ноября 2010

Это должно сработать.

public IEnumerable<UserRoleIndicator> GetRoleIndicators(string userName)
{
    var roles = _roleProvider.GetAllRoles();
    var userRoles = _roleProvider.GetRolesForUser(userName);

    return roles.Select(role => new UserRoleIndicator 
    { 
        RoleName = role,
        InRole = userRoles.Any(userRole => role == userRole) 
    }); 
}

Примечание: при использовании метода расширения IEnumerable .Any возвращается значение true, как только найдено совпадение, поэтому он не будет без необходимости повторять итерацию остальной части коллекции после того, как уже найден матч.

...