2017-08-25 61 views
0

我有一个包含很多属性的对象列表。我想编写一个EF6查询来提取匹配对象列表中特定属性的所有记录。实体框架6具有多维对象的条件

这是我有一个它不工作。

userRoles是我的List<>RoleID是我想检查该实体的RoleId的财产。

List<DataAccess.Entities.DB.StorageContainerRole> 
    containerRoles = db.StorageContainerRoles 
         .Where(x => userRoles.Select(y => y.RoleID.Value) 
         .Contains(x.RoleId.Value)) 
         .Include(z => z.StorageContainer) 
         .ToList(); 

这是我收到的错误:

无法创建类型的常量值 'DataAccess.Entities.DB.UserRole'。只有原始类型或枚举类型在此上下文中受支持。

任何帮助,将不胜感激!

+0

你怎么知道它不工作?你检查了你的数据吗?你的查询看起来不错。 –

+0

我在我的问题中增加了错误 – Nugs

+0

将'userRoles.Select(y => y.RoleID.Value)'指派给查询外部的变量并使用里面的变量(EF6要求)。 –

回答

1

EF应该将您的查询转换为SQL,并且它不知道如何处理复杂(非Primitive)结构。 因此,对于您的示例,您可以在查询之外执行userRoles.Select(y => y.RoleID.Value),这将为您提供原始类型的集合,这应该是EF可以解析的。

在更复杂的情况下,例如, x.RoleId == a && x.RoleType == b你应该强制EF建立SQL子句OR链:WHERE (roleid = 1 AND roletype = 7) OR (roleid = 2 AND roletype = 8)检查this link它说明了如何建立与扩展代码一个简单的例子提供

+0

您使用的变量没有意义,因为您正在覆盖正在运行foreach循环的变量。另外'.Where()'语句的组合使用'AND'构建,而不是'OR' – Progman

+0

错误的变量名称。关于'AND'你是对的。谢谢 – ASpirin

2

当你有用户角色的列表中已经获取OR查询,你可以建立ID列表并在您的查询中检查此列表:

IList<int> userRoleIds = userRoles.Select(it => it.RoleId.Value).ToList(); 

IList<StorageContainerRole> containerRoles = db.StorageContainerRoles 
    .Include(z => z.StorageContainer) 
    .Where(x => userRoleIds.Contains(x.RoleId)) 
    .ToList();