#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. Пытались ли вы реализовать глобальные фильтры запросов для арендаторов и программных удалений?