我有3个实体,用户,任务和权限。用户可以拥有许多权限。任务还具有许多与之相关的权限。我想在我的查询中捕获的想法是:我的任务需要由具有该任务所需的所有正确权限的用户完成。
我正在努力解决这个问题。我认为这就是我的需要:
var userList = context.Users
.Include("Permissions")
.Where(x => neededPermissionFromTask.Except(x.Permissions).Count() == 0).ToList();
但我得到一个例外:
无法创建“Permission”类型的常量值。只有原始 这里支持类型(例如Int32,String和Guid') 上下文。
感谢任何帮助,建议或评论。
答案 0 :(得分: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();
答案 1 :(得分:0)
异常是由您的列表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的对象。