Лучший способ получить пользователей, не принадлежащих ни к какой роли? - PullRequest
2 голосов
/ 30 марта 2011

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

using System.Collections.Generic;
using System.Linq;
using System.Web.Security;

public static IEnumerable<MembershipUser> GetUsersHavingNoRole() {
  var allUsers = Membership.GetAllUsers().Cast<MembershipUser>();
  foreach (var user in allUsers) {
    if (Roles.GetRolesForUser(user.UserName).Length.Equals(0)) {
      yield return user;
    }
  }
}

Ответы [ 3 ]

2 голосов
/ 30 марта 2011

Я бы ожидал, что обычно пользователей будет больше, чем ролей - поэтому может имеет смысл перебирать роли (возврат на Roles.GetAllRoles()), составлять список пользователей в любой из этих ролей (например, путем создания HashSet<string> и добавления пользователей для каждой роли, возвращаемой Roles.GetUsersInRole), а затем поиска различий между ними и всеми пользователями. Поэтому, если вы используете LINQ, вы можете использовать:

var usersInRolesQuery = Roles.GetAllRoles()
                             .SelectMany(role => Roles.GetUsersInRole(role));

var usersInRoles = new HashSet<string>(usersInRolesQuery);
return Membership.GetAllUsers()
                 .Cast<MembershipUser>()
                 .Where(user => !usersInRoles.Contains(user.UserName));

Конечно, это все еще имеет дело с тем же количеством данных - но это может означать меньшее количество обращений к любому хранилищу данных.

Тестировали ли вы приложение, чтобы узнать, насколько дорогой ваш метод?

0 голосов
/ 29 июня 2011

Если я правильно понимаю ваш вопрос. Этот код должен помочь!

MembershipUserCollection users = Membership.GetAllUsers();
MembershipUserCollection usersNoRoles = new MembershipUserCollection();

    foreach (MembershipUser user in users)
    {
        string[] roles = Roles.GetRolesForUser(user.UserName);

        // if roles empty
        if (roles.Count() == 0)
        {
            // Add User to a List for User with no Roles
            usersNoRoles.Add(user);
        }

   }
0 голосов
/ 30 марта 2011

В зависимости от количества пользователей, ролей и отношений между ними, а также от того, сколько раз вам нужна эта информация, она может стоить того (было достаточно отказов от ответственности?), Чтобы добавить дополнительный метод к(настраиваемый) поставщик ролей.

Собственный запрос, требуемый в поставщике , может быть гораздо более эффективным, чем использование LINQ, как вы делаете сейчас.

Aмногое зависит от факторов в первой строке этого ответа, а также от поставщика.Также может возникнуть проблема с поддержкой, так как вы добавляете запрос, который может не поддерживаться в будущем (следующая версия поставщика)

...