实体框架 - Linq查询列表中的值

时间:2013-05-08 13:38:34

标签: c# frameworks entity

我在.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)

我需要指点一下。

由于

EF Design

1 个答案:

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