如何获取不在角色中的用户

5

有没有一种相对高效的方法来获取不在特定角色中的用户列表?

我能想到的仅有的两种方法是:

  1. 从数据库中获取所有用户并在代码中进行检查

  2. 直接访问数据库,绕过角色提供程序


能否提供一些关于数据库结构的信息? - Aidiakapi
@Aidiakapi,这个结构是固定的。它是框架的一部分。 - Klaus Byskov Pedersen
我知道有一个,但我认为它是可定制的。 - Aidiakapi
5个回答

4
你可以获取所有用户列表,从中提取指定角色的用户:
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)
    );

3

另一种方法是通过扩展RoleProvider并添加GetUsersNotInRole()方法,在此处查询数据库。您还可以将RoleProvider.GetUsersInRole()与MembershipProvider.GetAllUsers()结合使用,找到差异。


2

我认为绕过角色提供程序直接查询数据库并没有什么问题。这样做肯定可以获得最佳性能。


同意,基本上您想要的是一个执行以下操作的 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 ) - MvcCmsJon

1

发现了这种方法,希望能帮到其他人。非常简单。

 var usernames = Roles.GetUsersInRole("Administrator");

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接