【问题标题】:Build dynamic filter expression构建动态过滤器表达式
【发布时间】:2018-11-18 11:57:38
【问题描述】:

你能帮忙吗,

我想构建 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 表达式:

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

问题是如何修复它并获得正确的结果?

【问题讨论】:

    标签: c# expression


    【解决方案1】:

    首先,在“描述”的情况下,您仍然使用 .Name。此外,您还为 LogicalOperation.And 和 LogicalOperation.Or 执行 Expression.And。

    其次,你从一个 Expression.Constant(true) 开始,它实际上相当于一个 bool,而你的返回表达式是 Func&lt;bool&gt;。您的 resultExpression 还必须是 Expression&lt;Func&lt;bool&gt;&gt; 才能使用 AddOr

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-23
      • 1970-01-01
      • 1970-01-01
      • 2012-02-17
      • 2016-11-25
      • 1970-01-01
      • 1970-01-01
      • 2014-07-06
      相关资源
      最近更新 更多