2011-01-02 9 views
7

Chcę zrobić "GetUsersInRoles", tzn. Chcę znaleźć wszystkich użytkowników MembershipUser posiadających co najmniej jedną z ról w zestawie ról, ale mogę Wydaje mi się, że to rozumiem.członkostwo asp.net C#: jak zrobić GetUsersInRoles (wiele ról) H

Mam GetUsersInRole, Membership.GetAllUsers(), Linq, ... ale jak?

Wszelkie uwagi mile widziana

Tommy

+0

Napisanie w zapisanym proc. Zajęłoby około 10 sekund. –

Odpowiedz

10

Oto wersja LINQ, zwraca MembershipUserCollection podobnie jak podobnymi metodami członków (FindUsersByEmail, FindUsersByName). To nie jest bardzo ładny, ponieważ opiera się na efekt uboczny ForEach:

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

Alternatywnie, jeśli lista MembershipUser zrobi:

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

i wreszcie jeśli wystarczy nazwy użytkowników można pominąć jednego 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; 
    } 
+0

Dziękuję bardzo za wszystkie odpowiedzi i szybkie odpowiedzi. Niestety nie mogę dodać punktów "użyteczności", ponieważ sam nie mam punktów reputacji. – tommyp

1

Nie ma takich metod jak GetUsersInRoles ale trzeba będzie użyć GetUsersInRole i pętlę poprzez swoje wymaganych ról.

trochę skomplikowane, ale tutaj jest jeden sposób:

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/>"); } 
+0

Dobrze - właśnie tego szukam w przyjemny sposób, najlepiej przy użyciu Linq – tommyp

1

Naprawdę ASP.Net dostawcę członkostwa wydaje się być zbudowany z myślą o użytkownika jest przywiązany do jednej roli. jednak mieliśmy podobne konfiguracje projektów, nad którymi pracowaliśmy. jej trochę niewygodne, ale spróbuj coś takiego, który pracował dla nas:

List<string> roleset_to_find = new List<string>() {"RoleA","RoleB"}; 

List<string> membersFound = new List<string>(); 

foreach (string role in roleset_to_find) 
{ 
     membersFound.AddRange(Roles.GetUsersInRole(role)); 
} 
Powiązane problemy