我可以根据GetAllUsers所处的角色过滤GetAllUsers返回的用户

时间:2011-12-26 23:33:41

标签: linq asp.net-mvc-3

我正在尝试创建一个管理界面,可以管理用户和角色(以及其他内容)。我有一个可以编辑,删除或查看的用户列表。我在行动中有这个代码:

var model = Membership.GetAllUsers()
   .Cast<MembershipUser>()
   .Select(x => new UserModel
      {
       UserName = x.UserName,
       Email = x.Email,
       UserRoles = Roles.GetRolesForUser(x.UserName)
      });

return View(model);

除了我不希望管理员能够互相编辑外,这一切都很好。所以我需要过滤掉“超级管理员”角色中的所有用户。通过逐步完成每个用户的每个角色,看看他们是否是会员,我当然可以解决这个问题。我想知道是否有一个很好的成功方法来通过过滤Select语句中的结果集,或使用Except或Where

1 个答案:

答案 0 :(得分:0)

我通常会想到我想要生成的sql然后尝试编写linq,使用简单的where语句过滤角色应该相当容易。

然而,您似乎试图将查询的每个部分抽象为较小的位,这可能会使编写更容易,但会对性能产生破坏性影响。例如,如果您调用的GetRolesForUser方法导致GetAllUsers返回的每个用户额外的数据库查询,我不会感到惊讶,使用Include方法是一种更好的方式同时获取所有角色。

var model = context.Users
           .Include(user => user.UserRoles)
           .Where(user => !user.UserRoles.Any(role => role == superAdmin)
           .Select(user => new UserModel() { UserName = user.UserName, Email = user.Email, UserRoles = user.UserRoles});