Lambda表达式以及如何将它们组合起来?

Ric*_*end 14 .net c# linq generics lambda

如何使用OR将两个lambda表达式合并为一个?

我尝试了以下但是合并它们需要我将参数传递给Expression.Invoke调用,但是我想将传递给新lambda的值传递给每个child-lambda.

Expression<Func<int, bool>> func1 = (x) => x > 5;
Expression<Func<int, bool>> func2 = (x) => x < 0;
//Combines the lambdas but result in runtime error saying I need to pass in arguments
//However I want the argument passed into each child lambda to be whatever is passed into the new main lambda
Expression<Func<int, bool>> lambda = Expression.Lambda<Func<int, bool>>(Expression.Or(Expression.Invoke(func1), Expression.Invoke(func2)));

 //The 9 should be passed into the new lambda and into both child lambdas
 bool tst = lambda.Compile().Invoke(9);
Run Code Online (Sandbox Code Playgroud)

任何想法如何将两个lambda表达式合并为一个并具有子lambdas的参数是父的?

Mat*_*ott 18

我发现学习表达式的最好方法是查看PredicateBuilder的源代码.

如果要组合多个语句,可以:

Expression<Func<int, bool>> func1 = (x) => x > 5;
Expression<Func<int, bool>> func2 = (x) => x > 10;

var invocation = Expression.Invoke(func2, func1.Parameters.Cast<Expression>());
var expression = Expression.Lambda<Func<int, bool>>(Expression.OrElse(func1.Body, invocation), func1.Parameters);
Run Code Online (Sandbox Code Playgroud)

Expression.Invoke创建的参数适用于您的InvocationExpression func2.

事实上,PredicateBuilder可能就是您需要的一切.

var predicate = PredicateBuilder.False<int>();
predicate = predicate.Or(x => x > 5);
predicate = predicate.Or(x => x > 10);
Run Code Online (Sandbox Code Playgroud)

我会修改" x > 5x > 10",对OR来说似乎很奇怪.

希望有所帮助.

  • 顺便说一句,Linq to Entities不支持`Expression.Invoke`.所以尽管这会编译成IL.它不会编译为SQL. (2认同)