我在.NET 3.5上使用实体框架,我不能在我的生活中弄清楚如何编写一些Linq来遍历以下设计:
基本上我试图弄清楚用户是否具有特定EntityType的权限(EntityAction)。现在,用户和角色在Active Directory中维护 - 但系统可以执行查找以查找用户所属的角色/组。
我们假设我有以下数据:
的EntityType
EntityTypeId:1
名称:实体一
用户
UserId:1
AccountName:Andez
角色
RoleId:1
AccountName:MyRole
EntityAction
EntityActionId:1
姓名:做点什么
RoleEntityActionAssociation
(Role和EntityAction之间的关联)
EntityActionId:1
RoleId:1
我在List中存储用户的组名(来自Active Directory):
List<string> groupNames = new List<string>();
问题
但是,我试图将一些Linq拼凑在一起,以确定用户(或者他在List groupNames中分配的角色之一)是否与给定EntityType的特定EntityAction相关联。
// get reference to the user
User user = context.Users.Where(x => x.AccountName == "Andez").FirstOrDefault();
// get reference to the entity type we want to query
EntityType et = context.EntityTypes.Where(x => x.Name == "Entity One").FirstOrDefault();
// get list of all entity actions for the user
var result = from ea in et.EntityActions
where ea.EntityActionId == 1 && (ea.Users.Contains(user) || ea.Roles.Count(r => groupNames.Contains(r.AccountName)) > 0)
select ea;
当然我的查询在上面不起作用 - 它不会返回任何结果(result.ToList()。Count == 0)
我需要指点一下。
由于
答案 0 :(得分:3)
也许您需要按用户ID检查用户,将ea.Users.Contains(user)
替换为ea.Users.Any(us => us.UserId == user.UserId)
:
var result = from ea in et.EntityActions
where ea.EntityActionId == 1 && ea.Users.Any(us => us.UserId == user.UserId)
select ea;
更新0
试试这段代码吧:
var result = from ea in et.EntityActions
where ea.EntityActionId == 1 &&
(ea.Users.Any(us => us.UserId == user.UserId) || ea.Any(r => groupNames.Contains(r.AccountName)))
select ea;