EFCore Lazy Загрузка с несколькими операторами where - PullRequest
0 голосов
/ 14 февраля 2020

Я настроил DbContext с отложенной загрузкой с использованием прокси:

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

Я использую IQueryable для определения запроса к сущности, имеющей несколько свойств навигации:

IQueryable<Entity> query = context.Entity;

После этого я определил фильтр в предложении where, используя несколько Fun c:

 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 ) I получаю следующую ошибку:

Была предпринята попытка лениво загрузить свойство навигации IdStatusNavigation на отдельную сущность типа EntityProxy. Ленивая загрузка не поддерживается для отдельных сущностей или сущностей, которые загружены с помощью AsNoTracking ()

Я не использовал AsNoTracking ... Если я отлаживаю процесс, я вижу это во второй функции свойства навигации выдают исключение System.InvalidOperation.

Как я могу решить эту ошибку?

Большое спасибо, С уважением

1 Ответ

0 голосов
/ 27 февраля 2020

Кажется, что типы функций не могут быть переведены на SQL Язык, поэтому этот фрагмент кода выполняется, когда результат запроса находится в памяти. Таким образом, после доступа к первому свойству навигации все свойства навигации, кажется, располагаются и не могут быть доступны в будущем.

Поэтому я переписал код, чтобы сделать эти фильтры с данными в памяти (после ToList ( ) исполнение).

...