C# 如何将LambdaExpression转换为表达式<;Func<;T、 布尔>&燃气轮机;在C中#

C# 如何将LambdaExpression转换为表达式<;Func<;T、 布尔>&燃气轮机;在C中#,c#,lambda,expression-trees,iqueryable,predicatebuilder,C#,Lambda,Expression Trees,Iqueryable,Predicatebuilder,下面的代码基于我的SearchTerm输入在运行时生成LambdaExpression。我试图构建一个动态where子句。然而,我被困在如何从LambdaExpression转换为Expression 私有静态表达式GetSearchAppliedQuery(IEnumerable术语) { var parameterExpression=ExpressionHelper.Parameter(); 表达式finalExpression=表达式常数(true); 表达式子表达式=表达式常数(fal

下面的代码基于我的
SearchTerm
输入在运行时生成
LambdaExpression
。我试图构建一个动态
where
子句。然而,我被困在如何从
LambdaExpression
转换为
Expression

私有静态表达式GetSearchAppliedQuery(IEnumerable术语)
{
var parameterExpression=ExpressionHelper.Parameter();
表达式finalExpression=表达式常数(true);
表达式子表达式=表达式常数(false);
//向后构建LINQ表达式:
//query=query.Where(x=>x.Property==“Value”&&(x.AnotherProperty==“Value”| | x.SomeAnotherProperty==“Value”);
foreach(var术语)
{
var hasMultipleTerms=term.EntityName?包含(',')??false;
如果(有多个仪表)
{
var entityTerms=term.EntityName.Split(',');
foreach(entityTerms中的var entityTerm)
{
term.EntityName=entityTerm;
//x=>x.Property==“Value”| | x.AnotherProperty==“Value”
subExpression=Expression.OrElse(subExpression,GetComparisonExpression(term,parameterExpression));
}
}
//x=>x.Property==“Value”&&x.AnotherProperty==“Value”
finalExpression=Expression.AndAlso(finalExpression,hasMultipleTerms?子表达式:GetComparisonExpression(term,parameterExpression));
}
//x=>x.Property==“Value”&&(x.AnotherProperty==“Value”| | x.SomeAnotherProperty==“Value”)
var lambdaExpression=ExpressionHelper.GetLambda(parameterExpression,finalExpression);
//如何进行此转换??
表达式returnValue=。。??;
返回值;
}
我正在尝试应用上述方法的结果来获取查询,如下所示:

公共静态IQueryable GetQuery(IQueryable inputQuery,ISpecification规范)
{
var query=inputQuery;
//使用规范的条件表达式修改IQueryable
if(specification.Criteria!=null)
{
query=query.Where(规范.条件);
}
...
返回查询;
}
所以我的最后一个问题是

query=query.Where(x=>x.Property==“Value”&&(x.AnotherProperty==“Value”| | x.SomeAnotherProperty==“Value”))
编辑-1: 根据@Ivan Stoev的请求添加
ExpressionHelper.GetLambda
方法

公共静态类ExpressionHelper
{
公共静态LambdaExpression GetLambda(参数Expression obj,表达式arg)
{
返回GetLambda(typeof(TSource)、typeof(TDest)、obj、arg);
}
公共静态LambdaExpression GetLambda(类型source、类型dest、参数Expression obj、表达式arg)
{
var lambdaulder=getlambdauncbuilder(源、目标);
return(LambdaExpression)lambdbuilder.Invoke(null,新对象[]{arg,新对象[]{obj});
}
私有静态MethodInfo GetLambdaFuncBuilder(类型source,类型dest)
{
var-predicateType=typeof(Func).MakeGenericType(source,dest);
返回LambdaMethod.MakeGenericMethod(谓词类型);
}
}

我是不是错过了一些基本的东西,还是做错了什么?请协助。

用于获取lambda表达式的
ExpressionHelper.GetLambda
方法隐藏其实际类型,这是所需的
表达式
,因此您只需使用强制转换运算符:

return (Expression<Func<T, bool>>)lambdaExpression;
返回(表达式)lambdaExpression;
或者更好的方法是,将
ExpressionHelper.GetLambda
的结果类型更改为
Expression
,或者不使用该helper方法-当您在编译时知道泛型类型参数时,如果泛型方法(
ExpressionHelper.GetLambda
似乎与
Expression.Lambda
)等效,只需使用一个即可,例如

var lambdaExpression=Expression.Lambda(parameterExpression,finalExpression);

什么是
ExpressionHelper.GetLambda
方法?我们能看到它吗?在Edit-1中添加了
ExpressionHelper.GetLambda
和其他方法
var lambdaExpression = Expression.Lambda<Func<T, bool>>(parameterExpression, finalExpression);