理解表达式树和参数求值我正在尝试修改一个动态构建包含表达式的表达式树,最终会产生类似SQL的表达式PIN(123,124,125),200,201)而不是检查执行范围检查,最终在SQL中像(P>=123ANDP=200ANDP<=201)我的解决方案基于这篇文章。staticpublicExpressionBuildContainsExpression(ExpressionvalueSelector,IEnumerablevalues){//为帖子删除:输入检查和边缘情况varequals=values.Select(value=>(Expression)Expression.Equal(valueSelector.Body,Expression.Constant(value,typeof(TValue))));varbody=equals.Aggregate((accumulate,equal)=>Expression.Or(accumulate,equal));返回Expression.Lambda(body,p);如果我提供比较值,我可以让范围检查工作:longtestValue=5;Listranges=newList(){newKeyValuePair(3,6),newKeyValuePair(10,12),newKeyValuePair(20,20),};列表范围表达式=newList();foreach(varpairinranges){vargreaterThanOrEqual=Expression.GreaterThanOrEqual(Expression.Constant(testValue),Expression.Constant(pair.Key));varlessThanOrEqual=Expression.LessThanOrEqual(Expression.Constant(testValue),Expression.Constant(pair.Value));varinRange=表达式。AndAlso(大于或等于,小于或等于);rangeExpressions.Add(inRange);}varfinal=rangeExpressions.Aggregate((a,b)=>Expression.Or(a,b));varresult=Expression.Lambda(final).Compile()();但是,当我将该代码放入与Linq一起使用的方法中时,我不知道如何从传入的表达式中获取比较值该方法的签名是:ExpressionBuildRangeExpression(ExpressionvalueSelector,IEnumerablevalues)它被用作:Expressionmatch=BuildRangeExpression(my=>my.ProductCode,productCodes);varresult=db.MyTypes.Where(匹配);问题我如何评估?ExpressionvalueSelector以便我可以使用传递给BuildRangeExpression的值而不是我当前的硬编码值longtestValue=5;我认为博文中的代码正是您所需要的:您所要做的就是使用valueSelector。Body而不是Expression.Constant(),并将原始参数添加到生成的表达式中:varequals=values.Select(tuple=>Expression.AndAlso(Expression.GreaterThanOrEqual(valueSelector.Body,Expression.Constant(tuple.Item1)),Expression.LessThanOrEqual(valueSelector.Body,Expression.Constant(tuple.Item2))));body=equals.Aggregate(Expression.OrElse);返回Expression.Lambda>(body,p);}使用Expression.Parameter。创建一个参数:varparam=Expression.Parameter(typeof(TElement),"arg")而不是Expression.Constant(testvalue),你需要把param。那么,你需要做的:以上是C#学习教程:理解表达式树和参数求值。如果对大家有用,需要详细了解C#学习教程,希望大家多多关注——varresult=Expression。Lambda>(final,param).Compile()本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: