【问题标题】:How to get users not in role,如何让用户不在角色中,
【发布时间】:2011-07-16 13:46:59
【问题描述】:

是否有任何合理有效的方法来获取不属于特定角色的用户列表?

我能看到的唯一方法是

  1. 从 DB 中获取所有用户并检查代码

  2. 直接进入数据库并回避角色提供者

【问题讨论】:

  • 想提供一些关于数据库结构的信息吗?
  • @Aidiakapi,结构是固定的。它是框架的一部分。
  • 我知道有一个,但我认为它是可定制的。

标签: c# asp.net asp.net-membership roles roleprovider


【解决方案1】:

我不认为绕过角色提供者直接查询数据库有什么问题。这样你肯定会得到最好的表现。

【讨论】:

  • 同意,基本上你想要的是一个可以做到这一点的sprok SELECT * FROM users u WHERE NOT EXISTS ( SELECT 1 FROM UsersInRoles ur WHERE ur.RoleId = '8E79BA23-E568-423F-80F3-AF60C33DC7EB' AND ur.UserId = u.UserID )
【解决方案2】:

另一种方法是使用 GetUsersNotInRole() 方法扩展 RoleProvider 并在那里查询数据库。也可以将 RoleProvider.GetUsersInRole() 与 MembershipProvider.GetAllUsers() 结合起来,找出区别

【讨论】:

    【解决方案3】:

    您可以获取所有用户列表并从列表中提取指定角色的用户:

    var usersInRole = Roles.GetUsersInRole("admin");
    var users = Membership.GetAllUsers()
        .Cast<MembershipUser>()
        .Select(u => 
            !usersInRole.Contains(u.UserName)
        );
    

    【讨论】:

      【解决方案4】:

      在 Alex 提供的代码中将 Select 更改为 Where 将实际返回结果,而不仅仅是 true/false。

      var usersInRole = Roles.GetUsersInRole("admin");
      var users = Membership.GetAllUsers()
          .Cast<MembershipUser>()
          .Where(u => 
              !usersInRole.Contains(u.UserName)
          );
      

      【讨论】:

        【解决方案5】:

        以这种方式找到,希望这对其他人也有帮助。很简单。

         var usernames = Roles.GetUsersInRole("Administrator");
        
                    var adminUsers = db.UserProfiles
                         .Where(x => !usernames.Contains(x.UserName)).ToList();
                    return View(adminUsers);
        

        【讨论】:

          猜你喜欢
          • 2012-04-04
          • 2019-03-10
          • 1970-01-01
          • 2020-11-08
          • 2012-02-27
          • 2020-05-31
          • 2020-10-16
          • 1970-01-01
          • 2023-01-04
          相关资源
          最近更新 更多