Построить динамическое выражение фильтра - PullRequest
0 голосов
/ 18 ноября 2018

Не могли бы вы помочь, пожалуйста,

Я хочу построить lamda для фильтрации списка объектов. Я хочу иметь конструктор, который будет принимать список полей и значений и возвращать лямбду, чтобы использовать ее позже для фильтрации списка.

Я сделал следующее:

public class SurveyListFilterBuilder
{
     public static Func<SurveysQueryResultItem, bool> Build(string[] searchField, string[] searchFieldValue, LogicalOperation operation)
    {
        Expression resultExpression = Expression.Constant(true);

        for (var i = 0; i < searchField.Length; i++)
        {
            var field = searchField[i];
              var fieldFilterExpression = GetFieldFilterExpression(field, searchFieldValue[i]);

            if (operation == LogicalOperation.And)
                resultExpression = Expression.And(resultExpression, fieldFilterExpression);
            else if (operation == LogicalOperation.Or)
                resultExpression = Expression.And(resultExpression, fieldFilterExpression);
        }

        return Expression.Lambda<Func<SurveysQueryResultItem, bool>>(resultExpression).Compile();
    }

    private static Expression<Func<MyClass, bool>> GetFieldFilterExpression(string field, string fieldValue)
    {
        switch (field)
        {
            case "name":
                return x => x.Name.Contains(fieldValue);
            case "description":
                return x => x.Name.Contains(fieldValue);
                default:
                    throw new NotSupportedException();
        }
    }
}

Но это не работает, потому что, кажется, я применяю выражение bool оператора ADD и выражение Func:

Бинарный оператор А не определен для типов 'System.Boolean' и 'System.Func`2 [ConsoleApp1.MyClass, System.Boolean]'. '

Вопрос в том, как это исправить и добиться правильного результата?

1 Ответ

0 голосов
/ 19 ноября 2018

Прежде всего, в случае «описания» вы все еще используете .Name.Кроме того, вы выполняете Expression.And и для LogicalOperation.And, и для LogicalOperation.Or.

Во-вторых, вы начинаете с Expression.Constant (true), который фактически эквивалентен bool, в то время как ваши выражения возврата имеютFunc<bool>.Ваше resultExpression также должно быть Expression<Func<bool>>, чтобы использовать Add и Or.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...