【问题标题】:Query all the entities where list property contains everything in another list查询列表属性包含另一个列表中所有内容的所有实体
【发布时间】:2013-01-09 20:17:49
【问题描述】:
我有 3 个实体、用户、任务和权限。用户可以拥有许多权限。任务也有许多与之相关的权限。我试图在查询中捕捉到的想法是:我的任务需要由具有任务所需的所有正确权限的用户完成。
我正在为查询而苦苦挣扎。我想这就是我需要的:
var userList = context.Users
.Include("Permissions")
.Where(x => neededPermissionFromTask.Except(x.Permissions).Count() == 0).ToList();
但我得到一个例外:
无法创建“权限”类型的常量值。只有原始
在此支持类型('例如 Int32、String 和 Guid')
上下文。
感谢任何帮助、建议或 cmets。
【问题讨论】:
标签:
asp.net-mvc
linq
entity-framework
ef-code-first
【解决方案1】:
不是传递 Permission 对象的列表,而是传递这些权限的 id:
var ids = neededPermissionFromTask.Select(p => p.Id).ToList();
var userList =
context.Users.Include("Permissions")
.Where(u => ids.Except(u.Permissions.Select(p => p.Id)).Count() == 0)
.ToList();
【解决方案2】:
异常是由您的 neededPermissionFromTask 列表引起的 - 实体框架不知道如何处理 Permission 对象列表。
我会建议这样的事情 - 找到所有具有 ID taskId 的任务所需的所有权限的用户。
var users = context.Users
.Where(user => context.Tasks
.Single(task => task.Id == taskId)
.Permissions
.All(permission => user.Permissions
.Contains(permission)))
.ToList();
我不确定Permissions.Contains(permission) 是否有效 - 它可能会导致与问题中提到的相同的错误。但是有一种简单的方法 - 无需查找对象是否包含在集合中,只需查找具有相同 ID 的对象即可。