实体框架6具有多维对象的条件
问题描述:
我有一个包含很多属性的对象列表。我想编写一个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'。只有原始类型或枚举类型在此上下文中受支持。
任何帮助,将不胜感激!
答
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它说明了如何建立与扩展代码一个简单的例子提供
答
当你有用户角色的列表中已经获取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();
你怎么知道它不工作?你检查了你的数据吗?你的查询看起来不错。 –
我在我的问题中增加了错误 – Nugs
将'userRoles.Select(y => y.RoleID.Value)'指派给查询外部的变量并使用里面的变量(EF6要求)。 –