Не удалось перевести выражение EF 3.1 LINQ, содержащее виртуальную сущность

#asp.net-core #entity-framework-core

#asp.net-core #entity-framework-core

Вопрос:

Я пытаюсь отфильтровать некоторые записи, используя следующий код:

 return base.CreateFilteredQuery(input)
            .WhereIf(input.OrganisationUnitId > 0, t => t.Records.Any(x => input.OrganisationUnitId == x.Record.OrganisationUnitId))
            .WhereIf(!input.Term.IsNullOrEmpty(), w => w.CreatorUser.FullName.Contains(input.Term));
  

Но я получаю «классическую» недавнюю ошибку:

 .LeftJoin(
    outer: DbSet<User>
        .Where(u => __ef_filter__p_8 || !(((ISoftDelete)u).IsDeleted) amp;amp; __ef_filter__p_9 || ((IMayHaveTenant)u).TenantId == __ef_filter__CurrentTenantId_10), 
    inner: p => EF.Property<Nullable<long>>(p, "CreatorUserId"), 
    outerKeySelector: u => EF.Property<Nullable<long>>(u, "Id"), 
    innerKeySelector: (o, i) => new TransparentIdentifier<PrintJob, User>(
        Outer = o, 
        Inner = i
    ))
.Where(p => p.Inner.FullName.Contains(__input_Term_1))' could not be translated.
  

Я знаю w.Status.Содержит(ввод.Термин) работает без проблем, поэтому я предполагаю, что это дочерняя сущность CreatorUser, которая ей не нравится. Как я должен выполнять запрос для любых дочерних объектов?

Комментарии:

1. Это не недавняя ошибка, она существует с 2008 года. Запрос не может быть переведен в SQL, поэтому EF жалуется на это. Ядро EF 1.0 было настолько неполным, что даже простое GroupBy не могло быть переведено, поэтому оно просто загружало частичные результаты в клиент, чтобы он мог фильтровать или группировать остальные данные на клиенте. Излишне говорить, что это приводит к ужасающей производительности, неподходящей для приложений производственного уровня

2. В коде, который вы опубликовали, невозможно сказать, что это за запрос. CreateFilteredQuery В WhereIf EF Core или LINQ нет or. IsDeleted Свойства нет. Каков фактический запрос? Откуда взялось левое соединение?

3. Пытались ли вы реализовать глобальные фильтры запросов для арендаторов и программных удалений?