2010-11-28 65 views
2

我需要建立一个ASP.NET网站上的所有角色列表,分配给给定用户的列表,即角色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 2010-11-28 20:57:09

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 2010-11-28 21:08:35

相关问题