如果在 T
上创建了一个 Expression
实例,是否有可能将其转换为 Expression<Func<T, bool>>
?
最终我有一个 List<Expression>
,并需要生成一个Expression<Func<T, bool>>
,其中 List<Expression>
的每个表达式都与 AND
聚合。
如果在 T
上创建了一个 Expression
实例,是否有可能将其转换为 Expression<Func<T, bool>>
?
最终我有一个 List<Expression>
,并需要生成一个Expression<Func<T, bool>>
,其中 List<Expression>
的每个表达式都与 AND
聚合。
是的,只需调用 Expression.Lambda<Func<T, bool>>(..., parameter)
,其中 ...
是由您想要组合的表达式组成的表达式。
您可能需要使用 list.Aggregate(Expressions.AndAlso)
。
如果您的表达式不都共享相同的 ParameterExpression
,则需要重写它们以这样做。(使用 ExpressionVisitor
)
Expression.Parameter(typeof(T))
пјҢ然еҗҺе°Ҷе…¶дј йҖ’з»ҷжүҖжңүеӯҗеҸҘе’ҢLambda
гҖӮ - SLaksExpression<Func<T, bool>>
实例。MethodCallExpression
。public static class Utils
{
public static Expression<Func<T, bool>> And<T>(List<Expression> expressions)
{
var item = Expression.Parameter(typeof(T), "item");
var body = expressions[0].GetPredicateExpression(item);
for (int i = 1; i < expressions.Count; i++)
body = Expression.AndAlso(body, expressions[i].GetPredicateExpression(item));
return Expression.Lambda<Func<T, bool>>(body, item);
}
static Expression GetPredicateExpression(this Expression target, ParameterExpression parameter)
{
var lambda = target as LambdaExpression;
var body = lambda != null ? lambda.Body : target;
return new ParameterBinder { value = parameter }.Visit(body);
}
class ParameterBinder : ExpressionVisitor
{
public ParameterExpression value;
protected override Expression VisitParameter(ParameterExpression node)
{
return node.Type == value.Type ? value : base.VisitParameter(node);
}
}
}
CreateFilter
到底返回什么?请展示一些样例实现。或者当强制转换失败时,你无法强制转换的表达式的实际类型是什么? - Ivan Stoev
List<Expression<Func<T, bool>>>
吗? - Ivan Stoev