C# 理解表达式树和参数计算

C# 理解表达式树和参数计算,c#,expression-trees,C#,Expression Trees,我试图修改一个表达式树,它动态构建一个包含表达式,最终生成类似SQL的结果 p在(123124125200201) 而是执行范围检查,这最终会产生类似SQL的结果 (p>=123和p=200,p使用表达式。参数 创建一个参数: var param = Expression.Parameter(typeof(TElement), "arg") 您需要放置参数,而不是表达式.Constant(testvalue) 然后,您需要执行以下操作: var result = Expression.Lamb

我试图修改一个表达式树,它动态构建一个包含表达式,最终生成类似SQL的结果

p在(123124125200201)

而是执行范围检查,这最终会产生类似SQL的结果


(p>=123和p=200,p使用
表达式。参数

创建一个参数:

var param = Expression.Parameter(typeof(TElement), "arg")
您需要放置
参数,而不是
表达式.Constant(testvalue)

然后,您需要执行以下操作:

var result = Expression.Lambda<Func<TElement, bool>>(final, param).Compile() 
var result=Expression.Lambda(final,param).Compile()

使用
表达式.参数

创建一个参数:

var param = Expression.Parameter(typeof(TElement), "arg")
您需要放置
参数,而不是
表达式.Constant(testvalue)

然后,您需要执行以下操作:

var result = Expression.Lambda<Func<TElement, bool>>(final, param).Compile() 
var result=Expression.Lambda(final,param).Compile()

我认为这篇博文中的代码正是您需要的:您所要做的就是使用
valueSelector.Body
而不是
表达式.Constant()
并将原始参数添加到生成的表达式中:

public static Expression<Func<TElement, bool>>
    BuildRangeExpression<TElement, TValue>(
    Expression<Func<TElement, TValue>> valueSelector,
    IEnumerable<Tuple<TValue, TValue>> values)
{
    var p = valueSelector.Parameters.Single();

    var equals = values.Select(
        tuple =>
        Expression.AndAlso(
            Expression.GreaterThanOrEqual(
                valueSelector.Body, Expression.Constant(tuple.Item1)),
            Expression.LessThanOrEqual(
                valueSelector.Body, Expression.Constant(tuple.Item2))));

    var body = equals.Aggregate(Expression.OrElse);

    return Expression.Lambda<Func<TElement, bool>>(body, p);
}
公共静态表达式
BuildRangeExpression(
表达式值选择器,
IEnumerable值)
{
var p=valueSelector.Parameters.Single();
var等于=值。选择(
元组=>
安达尔索(
表达式。大于或等于(
valueSelector.Body,Expression.Constant(tuple.Item1)),
Expression.LessThanOrEqual(
valueSelector.Body,Expression.Constant(tuple.Item2));
var body=等于.聚合(表达式.OrElse);
返回表达式.Lambda(body,p);
}

我认为这篇博文中的代码正是您需要的:您所要做的就是使用
valueSelector.Body
而不是
表达式.Constant()
并将原始参数添加到生成的表达式中:

public static Expression<Func<TElement, bool>>
    BuildRangeExpression<TElement, TValue>(
    Expression<Func<TElement, TValue>> valueSelector,
    IEnumerable<Tuple<TValue, TValue>> values)
{
    var p = valueSelector.Parameters.Single();

    var equals = values.Select(
        tuple =>
        Expression.AndAlso(
            Expression.GreaterThanOrEqual(
                valueSelector.Body, Expression.Constant(tuple.Item1)),
            Expression.LessThanOrEqual(
                valueSelector.Body, Expression.Constant(tuple.Item2))));

    var body = equals.Aggregate(Expression.OrElse);

    return Expression.Lambda<Func<TElement, bool>>(body, p);
}
公共静态表达式
BuildRangeExpression(
表达式值选择器,
IEnumerable值)
{
var p=valueSelector.Parameters.Single();
var等于=值。选择(
元组=>
安达尔索(
表达式。大于或等于(
valueSelector.Body,Expression.Constant(tuple.Item1)),
Expression.LessThanOrEqual(
valueSelector.Body,Expression.Constant(tuple.Item2));
var body=等于.聚合(表达式.OrElse);
返回表达式.Lambda(body,p);
}

这还不够,表达式还应该从
值选择器
访问属性。这还不够,表达式还应该从
值选择器
访问属性。
var param = Expression.Parameter(typeof(TElement), "arg")
var result = Expression.Lambda<Func<TElement, bool>>(final, param).Compile() 
public static Expression<Func<TElement, bool>>
    BuildRangeExpression<TElement, TValue>(
    Expression<Func<TElement, TValue>> valueSelector,
    IEnumerable<Tuple<TValue, TValue>> values)
{
    var p = valueSelector.Parameters.Single();

    var equals = values.Select(
        tuple =>
        Expression.AndAlso(
            Expression.GreaterThanOrEqual(
                valueSelector.Body, Expression.Constant(tuple.Item1)),
            Expression.LessThanOrEqual(
                valueSelector.Body, Expression.Constant(tuple.Item2))));

    var body = equals.Aggregate(Expression.OrElse);

    return Expression.Lambda<Func<TElement, bool>>(body, p);
}