Я бы ожидал, что обычно пользователей будет больше, чем ролей - поэтому может имеет смысл перебирать роли (возврат на 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));
Конечно, это все еще имеет дело с тем же количеством данных - но это может означать меньшее количество обращений к любому хранилищу данных.
Тестировали ли вы приложение, чтобы узнать, насколько дорогой ваш метод?