Выражение MongoDB System.InvalidOperationException: «не поддерживается». - PullRequest
0 голосов
/ 02 марта 2019

Я пытаюсь объединить 2 фильтра запросов с драйвером mongodb, но фреймворк возвращает просто «System.InvalidOperationException:« x.MyBool2 не поддерживается. »«

Все следующие выражения выполняются успешно, кромепоследний, где я пытаюсь выполнить комбинированный запрос.

Что я делаю не так?

public async Task GetTest()
{
    Expression<Func<PostDto, bool>> filter = x => x.MyBool1 == true;
    Expression<Func<PostDto, bool>> filter1 = x => x.MyBool2 == true;
    Expression<Func<PostDto, bool>> filter2 = x => x.MyBool1 && x.MyBool2;

    var andAlsoExpression = Expression.AndAlso(filter.Body, filter1.Body);
    var combinedFilter = Expression.Lambda<Func<PostDto, bool>>(andAlsoExpression, filter.Parameters);

    var result = await Collection.AsQueryable().Where(filter).ToListAsync();
    var result1 = await Collection.AsQueryable().Where(filter1).ToListAsync();
    var result2 = await Collection.AsQueryable().Where(filter2).ToListAsync();

    var result3 = await Collection.AsQueryable().Where(x => x.MyBool1 && x.MyBool2).ToListAsync();

    var result4 = await Collection.AsQueryable().Where(combinedFilter).ToListAsync();

    Debugger.Break();
}

1 Ответ

0 голосов
/ 02 марта 2019

Мне помогло расширение Marc Gravell AndAlso:

static Expression<Func<T, bool>> AndAlso<T>(
    this Expression<Func<T, bool>> expr1,
    Expression<Func<T, bool>> expr2)
{
    // need to detect whether they use the same
    // parameter instance; if not, they need fixing
    ParameterExpression param = expr1.Parameters[0];
    if (ReferenceEquals(param, expr2.Parameters[0]))
    {
        // simple version
        return Expression.Lambda<Func<T, bool>>(
            Expression.AndAlso(expr1.Body, expr2.Body), param);
    }
    // otherwise, keep expr1 "as is" and invoke expr2
    return Expression.Lambda<Func<T, bool>>(
        Expression.AndAlso(
            expr1.Body,
            Expression.Invoke(expr2, param)), param);
}

Источник: Объединение двух выражений (выражение>)

Использование этого расширения вместо моей части AndAlso & Expression.Lambda решило проблему.

...