【问题标题】:Entity Framework - Linq to query where value in a list实体框架 - Linq 查询列表中的值
【发布时间】:2013-05-08 13:38:33
【问题描述】:

我在 .NET 3.5 上使用实体框架,但我终其一生都无法弄清楚如何编写一些 Linq 来遍历以下设计:

基本上,我试图确定用户是否具有特定 EntityType 的权限 (EntityAction)。现在用户和角色在 Active Directory 中维护 - 但系统可以进行查找以查找用户所属的角色/组。

假设我有以下数据:

实体类型

EntityTypeId:1

名称:实体一

用户

用户 ID:1

账户名:安德斯

角色

角色 ID:1

帐户名:我的角色

实体动作

EntityActionId: 1

名称:做点什么

RoleEntityActionAssociation

(Role 和 EntityAction 之间的关联)

EntityActionId: 1

角色 ID:1

我将用户(来自 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)

我需要这方面的指示。

谢谢

【问题讨论】:

  • 避免使用 FirstOrDefault 当您期望一个且只有一个结果并且如果找不到就会出现错误,使用 .Single()

标签: c# frameworks entity


【解决方案1】:

也许您需要按 Id 检查用户,将 ea.Users.Contains(user) 替换为 ea.Users.Any(us =&gt; 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;

【讨论】:

  • 刚刚试过。我的初始代码确实可以获取用户的 EntityActions - 我只是错过了数据库中的一些配置!但我仍然无法弄清楚角色部分
  • 谢谢...我怀疑这是因为我的对象没有被加载。鉴于我使用的是 .NET 3.5,因此没有延迟加载。我将查询分解为不同的代码行,直到我通过调用 Load 来强制加载我知道它应该使用的 EntityAction 的角色。问题是,我不知道如何确保为查询加载我需要的对象。其中 ea.EntityActionId == 1 && ((ea.Users.Any(us => us.UserId == user.UserId) || ea.Roles.Any(r => groupNames.Contains(r.AccountName))))确实有效。有什么想法可以很好地加载吗?
  • 阅读此article
  • 好的,感谢 Linq! ;-) 我现在已经加载了我的查询,并且刚刚购买了 LinqPad linqpad.net 来帮助我。
  • PS 我仍然无法让 groupNames.Contains 工作。也许我是 .NET 3.5 SP1,即 EF v1。我得到 LINQ to Entities 无法识别方法 'Boolean Contains(System.String)' 方法,并且此方法无法转换为存储表达式。
猜你喜欢
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多