在另一个lambda表达式中使用lambda表达式在另一个lambda表达式中使用lambda表达式我需要组合两个lambda表达式,第二个表达式“包含”第一个表达式。我搜索了很多但没有找到任何明确的答案......我要做的是:第一个表达式“expression1”作为参数传递给方法并且仅用于定义第二个lambda必须是哪个字段在或运行属性。原则上,我正在尝试执行以下操作://simplefieldselector:Expressionexpression1=obj=>obj.field;//尝试在第二个表达式中使用字段选择器:Expressione2=obj=>[[Resultofexpression1]].Equals("myValue");换句话说,我想得到:Expressione2=obj=>obj.field.Equals("myValue");我需要这样做,因为它并不总是被调用的Equals()方法,而是许多不同的方法。我试图将expression1编译成Func,以便在expression2中调用此Func,但是当我在LinQ中使用它时,出现异常,因为LinQ不支持Invoke节点类型。所以我的问题是:有没有办法将两个表达式的主体结合起来,请问怎么样?提前致谢!嗯,这应该可以解决问题:voidMain(){varexecute=Create(first=>first.MyStringField,//字段选择器second=>second.Equals("1234")//方法选择器);Console.WriteLine(execute(newTestClass("1234")));//trueConsole.WriteLine(execute(newTestClass("4321")));//false}classTestClass{publicstringMyStringField;publicTestClass(stringval){MyStringField=val;}}staticFuncCreate(Expression>fieldSelector,Expression>methodSelector){//待办事项:如有必要,对fieldSelector进行经典验证。//todo:如有必要,methodSelector的经典验证。varcompiledFieldSelector=fieldSelector.Compile();varcompiledMethodSelector=methodSelector.Compile();返回T=>compiledMethodSelector(compiledFieldSelector(T));请注意,由于lambda表达式的性质,您需要同时验证字段选择器和方法选择器,否则您可能会做一些非常奇怪的事情。或者,下一种方法创建不“组合”事物的lambda,从某种意义上说,LinqToEntities在解释查询时不应该有问题,这更好。staticFuncCreate(Expression>memberSelector,Expression>methodSelector){//待办事项:必要时对memberSelector进行经典验证。//todo:如有必要,methodSelector的经典验证。varmemberExpression=(MemberExpression)(memberSelector.Body);varmethodCallExpression=(MethodCallExpression)(methodSelector.Body);//输入TSource=>..varinput=Expression.Parameter(typeof(TSource));varcall=Expression.Call(Expression.MakeMemberAccess(输入,memberExpression.Member),methodCallExpression.Method,methodCallExpression.Arguments);returnExpression.Lambda>(call,input).Compile();}ChrisEelmaa的第二个答案是确定的,只需要删除.Compile()调用以避免出现Invokeexception:staticExpression>Create(Expression>memberSelector,Expression>methodSelector){//todo:memberSelector的经典验证,如果需要的话.//todo:如有必要,methodSelector的经典验证。varmemberExpression=(MemberExpression)(memberSelector.Body);varmethodCallExpression=(MethodCallExpression)(methodSelector.Body);//输入TSource=>..varinput=Expression.Parameter(typeof(TSource));varcall=Expression.Call(Expression.MakeMemberAccess(input,memberExpression.Member),methodCallExpression.Method,methodCallExpression.Arguments);返回Expression.Lambda>(call,input);}在我的例子中,那么这样使用:(selector是一个表达式,如u=>u.id,request是一个IQueryable,都作为参数接收)以上是C#学习教程:在另一个lambda表达式中使用lambda表达式分享所有的内容,如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注—Expression>contains=Create(selector,u=>u.Contains(searchExpression));IQueryableresult=request.Where(contains);转载请删除,请注明出处: