2010-11-28 10 views
2

ASP.NET Webサイト上のすべてのロールのリストを作成する必要があります。特定のユーザーに割り当てられたロールを使用します。ロールAPIを使用すると、すべてのロールとユーザーのロールを取得できます。 。私はこれらを組み合わせて、ユーザーに割り当てられたロールにグリッドを表示し、すべてのロールを表示し、ユーザーに割り当てられたロールにチェックマークを付けることができます。次のLINQ to Objectsの取り組みをどのように改善できますか?LINQを使用したユーザーロールクエリ

public IEnumerable<UserRoleIndicator> GetRoleIndicators(string userName) 
{ 
    // GetRolesForUser and GetAllRoles bith return string[]. 
    var rolesForUser = _roleProvider.GetRolesForUser(userName) 
     .Select(r => new UserRoleIndicator { RoleName = r, InRole = true }); 
    var rolesNotForUser = _roleProvider.GetAllRoles() 
     .Where(r => !rolesForUser.Contains(new UserRoleIndicator { RoleName = r, InRole = true })) 
     .Select(r => new UserRoleIndicator { RoleName = r, InRole = false }); 
    var rolesList = rolesForUser.Union(rolesNotForUser); 
    return rolesList; 
} 

答えて

3
 string[] roles = new string[] { "Admin", "Super", "Normal" }; 
     string[] userroles = new string[] { "Admin", "Normal" }; 

     var query = from r in roles 
        join u in userroles on r equals u 
        into temproles 
        from urs in temproles.DefaultIfEmpty() 
        select new UserRoleIndicator { RoleName = r, InRole = r == urs ? true : false }; 

このコードを試してみてください。

おかげ

Shakeebアーメド

+0

ああ、これはLINQの神話的な左の結合だと思うよ、ありがとう! – ProfK

2

これはトリックを行う必要があります。

public IEnumerable<UserRoleIndicator> GetRoleIndicators(string userName) 
{ 
    var roles = _roleProvider.GetAllRoles(); 
    var userRoles = _roleProvider.GetRolesForUser(userName); 

    return roles.Select(role => new UserRoleIndicator 
    { 
     RoleName = role, 
     InRole = userRoles.Any(userRole => role == userRole) 
    }); 
} 

注:IEnumerable<T>.Any拡張メソッドを使用して、一致が見つかったとして、それはすでに試合を発見した後すぐに、それは不コレクションの残りかかわら繰り返すないので、trueを返します。

+0

おかげで、素敵なコードが、@PeachLabs'コードは、小さな読みやすさの利点を持っています。 – ProfK

関連する問題