Я столкнулся с той же ошибкой, проблема возникла, когда у меня были предикаты, созданные с помощью PredicateBuilder, которые в свою очередь были составлены из других предикатов, созданных с помощью PredicateBuilder
например. (A ИЛИ B) И (X ИЛИ Y), когда один строитель создает A ИЛИ B, один создает X ИЛИ Y, а третий AND соединяет их вместе.
С одним уровнем предикатов AsExpandable работал нормально, когда было введено более одного уровня, я получил ту же ошибку.
Я не смог найти никакой помощи, но методом проб и ошибок я смог заставить вещи работать.
Каждый раз, когда я вызывал предикат, я следовал за ним с помощью метода расширения Expand.
Вот фрагмент кода, упрощенный для упрощения:
public static IQueryable<Submission> AddOptionFilter(
this IQueryable<Submission> query,
IEnumerable<IGrouping<int, int>> options)
{
var predicate = options.Aggregate(
PredicateBuilder.False<Submission>(),
(accumulator, optionIds) => accumulator.Or(ConstructOptionMatchPredicate(optionIds).Expand()));
query = query.Where(predicate.Expand());
return query;
}
Запрос - это IQueryable, для которого уже был вызван AsExpandable, ConstructOptionNotMatchPredicate возвращает выражение.
Как только мы преодолели ошибку, мы, безусловно, смогли создать сложные фильтры во время выполнения для структуры сущностей.
Edit:
Поскольку люди все еще комментируют и голосуют, я полагаю, это все еще полезно, поэтому я делюсь другим исправлением. По сути, я перестал использовать LinqKit и его построитель предикатов в пользу этого Универсального построителя предикатов , который имеет тот же API, но не нуждается в вызовах Expand, который стоит проверить.