C# 理解表达式树和参数计算
我试图修改一个表达式树,它动态构建一个包含表达式,最终生成类似SQL的结果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
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);
}