我有一个简单的安全模型,其中有:
这些表之间存在多对多的链接,因此用户可以使用角色,也可以将角色添加到路径中。我正在尝试编写一个函数,以便从用户名和路径中返回一个bool值,具体取决于用户是否可以访问该路径。我如何使用实体框架执行此操作?我目前有:
var rolesForUser = _entities.Users
.Include("Roles")
.Where(u => u.Login.Equals(username))
.Select(u => u.Roles);
if(rolesForUser.Count() == 0) return false;
var authentications = _entities.WebPaths
.Where(p => p.Path == path)
.WhereIn(p => p.Roles, rolesForUser);
return (authentications.Count() > 0);
使用扩展方法WhereIn,但这只能在灵长类动物上进行比较,因此目前无效。欢迎任何建议。
答案 0 :(得分:1)
您可以使用PredicateBuilder完成此操作。
脱离我的头顶:
var predicate = PredicateBuilder.False<WebPath>();
foreach (var role in from roles in rolesForUser
from r in roles.Role
select r)
{
predicate = predicate.Or (p => p.roles.Any(r => r.Id == role.Id));
}
var authentications = _entities.WebPaths.AsExpandable()
.Where(p => p.Path == path)
.Where(predicate);
return (authentications.Count() > 0);