我有3个实体,用户,任务和权限。用户可以拥有多个权限。任务还具有许多与之关联的权限。我试图在我的查询中捕获的想法是:我的任务需要由具有任务所需的所有正确权限的用户完成。
我正在努力查询。我想这就是我需要的:
var userList = context.Users
.Include("Permissions")
.Where(x => neededPermissionFromTask.Except(x.Permissions).Count() == 0).ToList();
但是我得到一个异常:
无法创建"权限"类型的常数值。只有原始类型(如Int32, String和Guid)在此支持上下文。
感谢任何帮助,建议或意见。
不传递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();
异常是由您的列表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的对象。