Asp.Net MVC 5标识如何不列出具有Admin角色的用户

时间:2014-07-24 14:01:35

标签: c# asp.net-mvc asp.net-mvc-5

有三个与角色相关的表。

  1. AspNetUsers - 保留UserId数据
  2. AspNetRoles - 保留RoleNameRoleId
  3. AspNetUserRoles - 通过AspNetUsers和AspNetRoles建立关系。它只有两个cloumns UserIdRoleId。但由于某些原因,我无法直接访问此表(如db.UserRoles)。
  4. 所以我想做的是避免列出管理员角色的用户。

    我的代码是这样的:

    return View(db.Users.OrderBy(e => e.UserName)
                        .ToPagedList(pageNumber, pageSize));
    

    我想我应该做这样的事情但是当我这样做时总是会出错

    return View(db.Users.Where(e => e.Roles.Where(r => r.RoleId != "1"))
                        .OrderBy(e => e.UserName)
                        .ToPagedList(pageNumber, pageSize));
                         // suppose that the RoleId of Admin is 1
    

2 个答案:

答案 0 :(得分:0)

return View(db.Users.Where(e => e.Roles.All(r => r.RoleId != "1"))
                  .OrderBy(e => e.UserName).ToPagedList(pageNumber, pageSize)); 
                    // Suppowse that the RoleId of Admin is 1

使用.All扩展程序

db.Users.Where(u=>!u.Roles.Any(r=>r.RoleId == "1"))

答案 1 :(得分:0)

试试这个:

const int adminRoleId = 1;
var query = db.Users.Where(user => !user.Roles
                                        .Any(role => role.Id 
                                                        == adminRoleId));
return View(query.OrderBy(e => e.UserName)
                 .ToPagedList(pageNumber, pageSize));

我认为在您的情况下,问题是由r.RoleId != "1"引起的,我认为RoleId属于int类型。更重要的是,表达式Where(e => e.Roles.Where(r => r.RoleId != "1"))无效。传递到第一个Where的表达式树应返回指定bool的{​​{1}}(它是您上下文中的用户),但是您将返回与admin不同的角色集合(而不是提及{{1} })。