我正在尝试创建一个管理界面,可以管理用户和角色(以及其他内容)。我有一个可以编辑,删除或查看的用户列表。我在行动中有这个代码:
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
答案 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});