实体框架多个多对多的查询

时间:2010-01-04 14:19:35

标签: c# entity-framework

我有一个简单的安全模型,其中有:

  • 用户
  • 角色
  • 路径

这些表之间存在多对多的链接,因此用户可以使用角色,也可以将角色添加到路径中。我正在尝试编写一个函数,以便从用户名和路径中返回一个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,但这只能在灵长类动物上进行比较,因此目前无效。欢迎任何建议。

1 个答案:

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