【发布时间】:2015-09-16 06:10:38
【问题描述】:
我有以下适用于模型数据的表达式 - 特此不使用实体框架:
public static Expression<Func<Resource, bool>> FilterResourcesByUserCriteria(IEnumerable<FilterValue> filterValuesForUser)
{
Expression<Func<Resource, bool>> filter = (resource) =>
// Get filter values for the current resource in the loop
resource.ResourceFilterValues
// Group filter values for user
.GroupBy(filterValue => filterValue.FilterValue.FilterGroup.Id)
// Each group must fulfill the following logic
.All(filterGroup =>
// For each filter group, only select the user values from the same group
filterValuesForUser
.Where(filterValueForUser => filterValueForUser.FilterGroup.Id == filterGroup.Key)
.Select(filterValueForUser => filterValueForUser.FilterValue1)
// Each group must at least one value in the sublist of filter values of the current user
.Any(filterValueForUser => filterGroup
.Select(resourceFilterValue => resourceFilterValue.FilterValue.FilterValue1)
.Any(x => x == filterValueForUser))
);
}
但是,当我尝试将此表达式插入到我的存储库方法的 where 子句中时(使用实体框架),我得到了这个著名的异常:
Unable to create a constant value of type. Only primitive types or enumeration types are supported in this context.
我怀疑这与名为 filterValuesForUser 的参数有关,该参数是复杂(即自定义)类型的集合。
在我执行与实体框架不直接相关的子查询的实体框架中,这种行为是否可能?我想在这里实现的是查询查询中每个组的自定义列表的子集。
针对此或其他变通办法的任何解决方案?我想尽量减少数据库调用的数量,最好将其限制在一个。
【问题讨论】:
-
-1 查询之外的对象太多。捕获的是什么并不明显。显示更多上下文代码。
-
@Aron 我觉得这里没有太多,只是这个
filterValuesForUser在外面准备好了,我觉得这里的代码已经足够了。 -
@Hopeless 我真的很难确定
filterValuesForUser是被捕获的IEnumerable。 -
@Aron 是的,这对我来说也很难,但仔细扫描后我们可以发现它。
-
嗨,Aron,我可以想象。我已经更新了代码摘录。我认为 filterValuesForUser 导致了问题,因为它与表达式中的项目没有直接关系,而是与外部集合相关。
标签: c# entity-framework expression where-clause