结合两个LINQ查询返回bool到一个返回bool?

时间:2014-06-16 17:00:53

标签: c# linq entity-framework entity-framework-6.1

我现在在一个返回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?

使用一个查询

2 个答案:

答案 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;

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