查询list属性包含另一个列表中所有内容的所有实体

时间:2013-01-09 20:17:49

标签: asp.net-mvc linq entity-framework ef-code-first

我有3个实体,用户,任务和权限。用户可以拥有许多权限。任务还具有许多与之相关的权限。我想在我的查询中捕获的想法是:我的任务需要由具有该任务所需的所有正确权限的用户完成。

我正在努力解决这个问题。我认为这就是我的需要:

var userList = context.Users
                      .Include("Permissions")
                      .Where(x => neededPermissionFromTask.Except(x.Permissions).Count() == 0).ToList();

但我得到一个例外:

  

无法创建“Permission”类型的常量值。只有原始   这里支持类型(例如Int32,String和Guid')   上下文。

感谢任何帮助,建议或评论。

2 个答案:

答案 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的对象。

相关问题