2

我写了以下确实有效的方法,但想知道是否有更有效的方法可以让所有用户没有任何角色。

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;
    }
  }
}
4

3 回答 3

2

我希望用户通常比角色多 - 因此迭代角色(返回 by ),建立任何这些角色的用户列表(例如,通过创建一个并为每个角色添加用户)可能是有意义的)返回的角色,然后找到该角色与所有用户之间的差异。因此,如果您使用的是 LINQ,则可以使用:Roles.GetAllRoles()HashSet<string>Roles.GetUsersInRole

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));

当然,这仍然在处理相同数量的数据 - 但这可能意味着到所涉及的任何数据存储的往返次数更少。

您是否对应用程序进行了基准测试以了解您当前的方法有多昂贵?

于 2011-03-30T06:08:05.960 回答
0

根据用户、角色和它们之间的关系的数量以及您需要此信息的次数,向(自定义)角色提供程序添加一个额外的方法可能是值得的(有足够的免责声明吗?)。

提供程序中所需的本机查询可能比您现在使用的方式使用 LINQ 更有效。

很大程度上取决于此答案第一行中的因素,但也取决于提供者。可维护性也可能是一个问题,因为您要添加将来可能不支持的查询(提供程序的下一个版本)

于 2011-03-30T06:33:48.217 回答
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);
        }

   }
于 2011-06-29T14:04:25.783 回答