【问题标题】:Better method to get users belonging to no role?让用户不属于任何角色的更好方法?
【发布时间】:2011-07-25 20:17:56
【问题描述】:

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

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

【问题讨论】:

    标签: c# linq asp.net-membership user-roles


    【解决方案1】:

    我希望用户通常比角色多 - 所以可能迭代角色是有意义的(返回 Roles.GetAllRoles()),在任何一个中建立用户列表这些角色(例如,通过创建HashSet&lt;string&gt; 并为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));
    

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

    您是否对应用程序进行了基准测试以了解您当前方法的成本?

    【讨论】:

    • 通常用户多于角色,你的意思是? ;)
    • 这很好;我从中吸取了教训。我没有进行基准测试——我的用户群很小,不会有任何区别,但我喜欢学习更好的技术。也许对于更大的应用程序,该方法可以在使用任何一种方法之前预先将用户数量与角色进行比较,但就像你说的那样,除非你有很多未使用的角色,否则用户几乎总是会超过角色。
    【解决方案2】:

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

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

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

    【讨论】:

    • 谢谢。我想用户的数量会达到数千(或数十万?)而不会太担心。在这种情况下,我想自动为所有新用户分配默认角色会更容易,并且无需担心此类用户。
    • :) 这就是我所做的。虽然如果 API 允许我们查询没有角色的用户会很好。
    【解决方案3】:

    如果我正确理解您的问题。这段代码应该有帮助!

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

    【讨论】:

    • 谢谢,但我看不出这是对起始代码的改进。
    猜你喜欢
    • 1970-01-01
    • 2012-10-17
    • 2018-11-12
    • 2021-06-14
    • 1970-01-01
    • 2021-08-02
    • 2012-02-27
    • 2011-07-16
    • 2012-04-16
    相关资源
    最近更新 更多