建立动态过滤器表达式

时间:2018-11-18 11:57:39

标签: c# expression

请您帮忙

我想构建用于过滤对象列表的lamda。我想要一个可以接受字段和值列表并返回lambda以便稍后用于过滤列表的构建器。

我已完成以下操作:

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();
        }
    }
}

但是它不起作用,因为似乎我应用了ADD运算符bool表达式和Func表达式:

没有为类型'System.Boolean'和'System.Func`2 [ConsoleApp1.MyClass,System.Boolean]'定义二进制运算符And。'

问题是如何解决并取得正确的结果?

1 个答案:

答案 0 :(得分:0)

首先,在“描述”情况下,您仍然使用.Name。此外,您还要执行Expression。对于LogicalOperation.And和LogicalOperation.Or都是如此。

第二,您从Expression.Constant(true)开始,它实际上等效于bool,而返回表达式为(page) => {。您的resultExpression还必须是Func<bool>才能使用Expression<Func<bool>>Add