我写了以下内容确实有效,但想知道是否有更有效的方法让所有用户都没有任何角色。
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;
}
}
}
答案 0 :(得分:2)
我希望通常会有更多的用户而不是角色 - 所以可能有意义地迭代角色(通过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));
当然,这仍然处理相同数量的数据 - 但它可能意味着更少的往返涉及任何数据存储区。
您是否对应用程序进行了基准测试,以了解当前方法的价格有多贵?
答案 1 :(得分:0)
根据用户数量,角色和它们之间的关系以及您需要此信息的次数,可能值得(有足够的免责声明吗?)来添加额外的方法到(自定义)角色提供者。
提供程序中所需的本机查询比现在使用LINQ方式更有效。
很大程度上取决于此答案第一行中的因素,还取决于提供者。可维护性也可能是一个问题,因为您要添加将来可能不支持的查询(下一版本的提供程序)
答案 2 :(得分:0)
如果我理解你的问题。这段代码应该有帮助!
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);
}
}