【问题标题】: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 的对象即可。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-21
        • 2022-01-02
        相关资源
        最近更新 更多