2010-11-28 6 views
2

Мне нужно создать список всех ролей на веб-сайте ASP.NET с теми, которые назначены данному пользователю помечены, то есть Roles 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 возвращает истину, как только совпадение найдено, так что это будет не напрасно итерацию, хотя остальная часть коллекции после того, как он уже нашел матч.

+0

спасибо, хороший код, но код @PeachLabs' имеет небольшое преимущество читаемость. – ProfK 2010-11-28 21:08:35

Смежные вопросы