我现在在一个返回bool?
的方法中有以下两个LINQ查询(针对EF 6.1):
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
在大多数情况下,这会导致对DB进行两次查询,因为!IsAllowed
非常常用户。
有没有办法对DB直接返回bool?
?
答案 0 :(得分:1)
您应该可以按IsAllowed
订购,然后选择第一个。这应该先放false
,然后放true
s。未经测试,但我认为你明白了这个想法:
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();
答案 1 :(得分: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;
编辑:糟糕,有人打败了我。同样的事情,基本上。