请您帮忙
我想构建用于过滤对象列表的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。'
问题是如何解决并取得正确的结果?
答案 0 :(得分:0)
首先,在“描述”情况下,您仍然使用.Name。此外,您还要执行Expression。对于LogicalOperation.And和LogicalOperation.Or都是如此。
第二,您从Expression.Constant(true)开始,它实际上等效于bool,而返回表达式为(page) => {
。您的resultExpression还必须是Func<bool>
才能使用Expression<Func<bool>>
和Add
。