带有多个where语句的EFCore延迟加载

时间:2020-02-14 09:38:17

标签: c# function entity-framework-core lazy-loading

我已经使用代理使用延迟加载配置了DbContext:

services.AddDbContext<MyDbContext>(options =>
                options.UseLazyLoadingProxies().UseSqlServer(Configuration.GetConnectionString("Connection"), sqlServerOptions => sqlServerOptions.CommandTimeout(90)), ServiceLifetime.Transient);

我使用IQueryable来针对具有多个导航属性的实体定​​义查询:

IQueryable<Entity> query = context.Entity;

在那之后,我使用多个Func在where子句中定义了一个过滤器:

 Func<Entity, int, bool> GetByParentId = (entity, id) => { return entity.ParentId == id; };
 Func<Entity, string, bool> FilterByName = (entity, textToSearch) => { return entity.Name.Equals(textToSearch, StringComparison.OrdinalIgnoreCase); };
 Func<Entity, string, bool> FilterByStatus = (entity, textToSearch) => { return entity.IdStatusNavigation.Description.ToLower().Contains(textToSearch); };

 Func<AssetGroup, int, string, bool> FilterEntities = (entity, idParam, textToSearch) => {
                return GetByParentId (entity, idParam)
                    && (FilterByName(entity, textToSearch) || FilterByStatus(entity, textToSearch));
            };

query = query.Where(entity=> FilterEntities(entity, idParam, lowerTextToSearch));

当我执行for(var entity on query)时,将执行具有导航属性的第一个函数( FilterByName ),并且实体上的所有属性(包括导航属性)都有值,我可以导航到相关的实体。

但是执行第二个函数( FilterByStatus )时,出现以下错误:

尝试对类型为“ EntityProxy”的分离实体延迟加载导航属性“ IdStatusNavigation”。分离的实体或使用'AsNoTracking()'加载的实体不支持延迟加载。

我还没有使用过AsNoTracking ...如果我调试过程,我可以看到第二个功能上的导航属性引发了异常System.InvalidOperation。

如何解决此错误?

非常感谢, 问候

1 个答案:

答案 0 :(得分:0)

似乎无法将函数类型转换为SQL语言,因此当查询结果在内存中时,将执行这段代码。因此,在访问第一个导航属性后,所有导航属性似乎都已被废弃,以后将无法访问。

因此,我重新编写了代码,以使此过滤器在内存中具有数据(执行ToList()之后)。