Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

asp.net c# membership: how to do a GetUsersInRoles (multiple roles)H

I want do a "GetUsersInRoles", i.e. I want to find all MembershipUser's having at least one of the roles in a set of roles, but I can't seem to get my head around this one.

I've got GetUsersInRole, Membership.GetAllUsers(), Linq,... but how?

Any feedback is greatly appreciated

Tommy

like image 716
tommyp Avatar asked Jan 02 '11 20:01

tommyp


2 Answers

Here's a Linq version, it returns a MembershipUserCollection just like the similar Membership methods (FindUsersByEmail, FindUsersByName). It's not very pretty since it relies on the ForEach side effect:

    public static MembershipUserCollection FindUsersByRole(string[] roles)
    {
        MembershipUserCollection msc = new MembershipUserCollection();

        roles.Select(role => Roles.GetUsersInRole(role))
        .Aggregate((a, b) => a.Union(b).ToArray())
        .Distinct()
        .Select( user => Membership.GetUser(user))
        .ToList().ForEach( user => msc.Add(user));

        return msc;
    }

Alternatively if a list of MembershipUser will do:

    public static List<MembershipUser> FindUsersByRole(string[] roles)
    {
        var userList = roles.Select(role => Roles.GetUsersInRole(role))
                            .Aggregate((a, b) => a.Union(b).ToArray())
                            .Distinct()
                            .Select( user => Membership.GetUser(user))
                            .ToList();
        return userList;
    }  

And finally if you just need the user names you can skip one select:

    public static List<string> FindUsersByRole(string[] roles)
    {
        var userList = roles.Select(role => Roles.GetUsersInRole(role))
                            .Aggregate((a, b) => a.Union(b).ToArray())
                            .Distinct()
                            .ToList();
        return userList;
    }
like image 81
BrokenGlass Avatar answered Oct 16 '22 08:10

BrokenGlass


There is not such method as GetUsersInRoles but you will have to use GetUsersInRole and loop through your required roles.

Bit complicated but here is one way:

string[] roles = {"role1", "role2" };
        string[] tempusers = new string[]{};
        List<string> users = new List<string>();
        foreach (string role in roles)
        {
            string[] usersInRole = Roles.GetUsersInRole(role);
            users =  tempusers.Union(usersInRole).ToList();
            tempusers = users.ToArray();
        }
        foreach (string user in users) { Response.Write(user + "<br/>"); }
like image 1
gbs Avatar answered Oct 16 '22 08:10

gbs