所以我知道有“类似”的问题,但不太像我想要实现这个。
我的问题是我想检查用户是否处于类似方法中指定的任何角色:
public bool HasUserGotAnyRoles(string userId, List<string> roleNames) {}
我知道您可以使用ApplicationUserManager
来处理这个问题,但对我来说这是不可能的,因为我有一个单独的项目来处理我的业务逻辑。
因此,我必须自己创建一个查询来检查用户是否已获得任何提供的角色列表,如果是,则返回他所拥有的角色。
认为这很容易,事实证明并非如此。
我正在使用Linq,当我db.Users.Include(x => x.Roles)
时,这会返回AspNetUserRoles
,其中只包含userId
和roleId
。
有没有人知道我如何通过角色名过滤链接到我的用户的角色,如果是这样的话又返回一个布尔值?我一直在尝试使用LinqPad来了解可行的方法,但到目前为止还没有成功。
请记住,我希望在一个查询中完成此操作。不是多个。
修改
我想出了这个:
public bool HasUserGotAnyRoles(string userId, List<string> roleNames)
{
var userRoles = Db.Users.Include(x => x.Roles).Single(x => x.Id == userId).Roles;
var result = userRoles.Any(x => Db.Roles.Where(y => roleNames.Contains(y.Name)).Select(y => y.Id).Contains(x.RoleId));
return result;
}
但这对于一个人来说很丑陋并且执行3次查询以获得我的结果。如果可能的话,我希望在一个查询中有这个。