从Lambda表达式中重构谓词会导致异常

本文关键字:异常 谓词 重构 Lambda 表达式 | 更新日期: 2023-09-27 18:03:14

我有一个方法,基于传入参数构建一个大型Lambda表达式(db查询过滤器,实体框架v. 1.0)。假设我们有一个Person、Department和Occupation实体。个人可以有职业,而职业属于一个部门。

代码如下:

var query = myDbContext.AsQueryable();
query = query.Persons.Where(.......) //Building some conditions
...
... //Adding conditions to the query if there are incoming params

问题在于下面的片段:

//We have a Department Id as parameter, so we want to filter persons whose Occupations belong to this Department
query = query.Where(per => per.Occupations.Where(occ => !occ.IsDeleted).Count(occ => occ.Department.Id == myFilterParameter) > 0;)

这很好,但是当从表达式中重构Count()构造的谓词时,像这样:

Expression<Func<Occupation, bool>> countExpression = occ => occ.DepartmentId == myFilterParameter;
query = query.Where(per => per.Occupations.Where(occ => !occ.IsDeleted).Count(countExpression.Compile()) > 0);

它会导致

内部。net框架数据提供程序错误1025.

你知道为什么会这样吗?

I tried also:

query = query.Where(per => per.Occupations.Where(occ => !occ.IsDeleted).AsQueryable().Count(countExpression.Compile()) > 0), the same picture.

从Lambda表达式中重构谓词会导致异常

打字错误:

Expression<Func<Occupation, bool>> countExpression = occ => occ.DepartmentId = myFilterParameter;

应该是:

Expression<Func<Occupation, bool>> countExpression = occ => occ.DepartmentId == myFilterParameter;

移除countExpression.Compile()上的Compile()

编辑-你试过这样的东西吗?

query.Where(per => per.Occupations
                      .Where(occ => !occ.IsDeleted)
                      .Any(countExpression));