2

目前,我在返回 a 的方法中有以下两个 LINQ 查询(针对 EF 6.1)bool?

if (db.Permissions.Any(p => p.Key == permission && p.Roles.Any(r => !r.IsAllowed 
                                && r.Role.Users.Any(u => u.UserId == userId))))
{
    return false;
}
if (db.Permissions.Any(p => p.Key == permission && p.Roles.Any(r => r.IsAllowed 
                                && r.Role.Users.Any(u => u.UserId == userId))))
{
    return true;
}

return null;

第一个检查用户是否处于任何角色,如果是!IsAllowed,则返回false(=> 用户/角色被拒绝权限,这会否决任何“允许”)。然后它检查用户是否处于任何已IsAllowed设置并true在这种情况下返回的角色。如果没有为用户的任何角色设置权限,则返回null
在大多数情况下,这会导致对数据库的两次查询,因为!IsAllowed用户并不经常这样做。

有没有办法对直接返回的数据库使用一个查询bool?

4

2 回答 2

1

您应该可以通过 订购IsAllowed,然后选择第一个。这应该把falses放在第一位,然后是trues。未经测试,但我想你明白了:

return db.Permissions.Where(p => p.Key == permission)
    .SelectMany(p => p.Roles.Where(r => r.Role.Users.Any(u => u.UserId == userId))
                            .Select(r => r.IsAllowed))
    .OrderBy(a => a)
    .Select(a => (bool?)a)
    .FirstOrDefault();
于 2014-06-16T17:14:40.110 回答
1

那里可能有更优雅的解决方案,但您可以加入表格并按 IsAllowed 排序以获得第一条(如果有的话)记录。

bool? allowed = (from p in db.Permissions
join r in db.Roles on p.id equals r.Permission_id
join u in db.Users on r.id equals u.Role_id
where p.Key == permission && u.UserId == userId
orderby r.IsAllowed
select r.IsAllowed
).FirstOrDefault();

return allowed;

编辑:哎呀,有人打败了我。同样的事情,基本上。

于 2014-06-16T17:22:46.690 回答