Как получить пользователей не в роли,

Есть ли какой-либо достаточно эффективный способ получить список пользователей, которые не находятся в определенной роли?

Единственные методы, которые я вижу, это

  1. Получите всех пользователей из БД и выполните проверку кода

  2. Перейдите непосредственно к базе данных и обойдите поставщика ролей.


person Mr. Flibble    schedule 16.03.2011    source источник
comment
Хотите предоставить некоторую информацию о структуре БД?   -  person Aidiakapi    schedule 16.03.2011
comment
@Aidiakapi, структура исправлена. Это часть рамок.   -  person Klaus Byskov Pedersen    schedule 16.03.2011
comment
Я знаю, что он есть, но я думал, что его можно настроить.   -  person Aidiakapi    schedule 16.03.2011


Ответы (5)


Другой способ - расширить RoleProvider с помощью метода GetUsersNotInRole() и запросить там БД. Вы также можете комбинировать RoleProvider.GetUsersInRole() с MembershipProvider.GetAllUsers() и найти разницу

person Robert    schedule 16.03.2011

Вы можете просто получить список всех пользователей и извлечь пользователей в роли, указанной из списка:

var usersInRole = Roles.GetUsersInRole("admin");
var users = Membership.GetAllUsers()
    .Cast<MembershipUser>()
    .Select(u => 
        !usersInRole.Contains(u.UserName)
    );
person Alex    schedule 16.03.2011

Изменение Select to Where в коде, предоставленном Alex, фактически вернет результаты, а не просто true/false.

var usersInRole = Roles.GetUsersInRole("admin");
var users = Membership.GetAllUsers()
    .Cast<MembershipUser>()
    .Where(u => 
        !usersInRole.Contains(u.UserName)
    );
person Arun K Kotte    schedule 01.10.2012

Я не думаю, что есть что-то неправильное в обходе поставщика ролей и непосредственном запросе базы данных. Таким образом, вы определенно добьетесь наилучшего результата.

person Klaus Byskov Pedersen    schedule 16.03.2011
comment
Согласен, в основном вам нужен sprok, который делает это SELECT * FROM users u WHERE NOT EXISTS ( SELECT 1 FROM UsersInRoles ur WHERE ur.RoleId = '8E79BA23-E568-423F-80F3-AF60C33DC7EB' AND ur.UserId = u.UserID ) - person MvcCmsJon; 02.05.2011

Нашел таким образом, надеюсь, что это поможет и другим. Очень просто.

 var usernames = Roles.GetUsersInRole("Administrator");

            var adminUsers = db.UserProfiles
                 .Where(x => !usernames.Contains(x.UserName)).ToList();
            return View(adminUsers);
person Don Thomas Boyle    schedule 23.08.2013