2013-05-08 283 views
0

我使用实体框架上.NET 3.5的列表,其中价值,我不能为我的生活弄清楚如何写一些LINQ到遍历了如下设计:实体框架 - 的LINQ查询在

基本上我试图弄清楚用户是否具有特定EntityType的权限(EntityAction)。现在用户和角色在Active Directory中维护 - 但系统可以执行查找来查找用户属于哪个角色/组。

假设我有以下数据:

的EntityType

EntityTypeId:1

名称:实体中的一个

用户

用户名:1​​

帐户名:Andez

角色

角色ID:1

帐户名:MyRole

EntityAction

EntityActionId:1

名称:只是做一些

RoleEntityActionAssociation

EntityActionId(角色和EntityAction之间的关联):1

角色ID:1

我存储组名用户(来自Active Directory):

List<string> groupNames = new List<string>(); 

问题

但是我试图拼凑一些LINQ到找出是否一个用户(或他在列表组名分配的角色之一)与给予的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()计数== 0)

我需要指点这个请。

感谢

EF Design

+2

避免使用FirstOrDefault,当你期望一个且只有一个结果,并且如果没有找到错误,使用.Single() – gareththegeek 2013-05-08 13:40:26

回答

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; 

UPDATE 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; 
+0

刚刚尝试过。我最初的代码确实能够获得用户的EntityActions - 我只是错过了数据库中的一些配置!但我仍然无法弄清楚角色部分 – Andez 2013-05-08 14:05:12

+0

我更新了答案。 – 2013-05-08 14:13:53

+0

谢谢你......我怀疑它是由我的对象没有被加载。鉴于我正在使用.NET 3.5,没有延迟加载。我把查询分解成不同的代码行,直到我强制加载了EntityAction的角色,我知道它应该通过调用Load来使用。事情是,我不知道如何确保我需要的对象将被加载查询。其中ea.EntityActionId == 1 &&((ea.Users.Any(us => us.UserId == user.UserId)|| ea.Roles.Any(r => groupNames.Contains(r.AccountName))))确实有效。任何想法很好地加载? – Andez 2013-05-08 14:57:15