如何构建具有多个条件的 Lambda 表达式树

Posted

技术标签:

【中文标题】如何构建具有多个条件的 Lambda 表达式树【英文标题】:How Build Lambda Expression Tree with multiple conditions 【发布时间】:2011-09-11 20:40:30 【问题描述】:

注意:我知道使用动态 linq 创建它非常简单,但我想学习。

我想创建一个“发现”的 lambda:Name=David AND Age=10。

 class Person
    
       public int Age  get; set; 
       public string Name  get; set; 
    

    var lambda = LabmdaExpression<Person>("Name", "David", "Age", 10);

static Expression<Func<T, bool>> LabmdaExpression<T>(string property1, string value1, string property2, int value2)


     ParameterExpression parameterExpression = Expression.Parameter(typeof(Person), "o");
     MemberExpression memberExpression1 = Expression.PropertyOrField(parameterExpression, property1);
     MemberExpression memberExpression2 = Expression.PropertyOrField(parameterExpression, property2);

     ConstantExpression valueExpression1 = Expression.Constant(value1, typeof(string));
     ConstantExpression valueExpression2 = Expression.Constant(value2, typeof(int));

     BinaryExpression binaryExpression1 = Expression.Equal(memberExpression1, valueExpression1);
     BinaryExpression binaryExpression2 = Expression.Equal(memberExpression2, valueExpression2);

     var ret1 =   Expression.Lambda<Func<T, bool>>(binaryExpression1, parameterExpression);
     var ret2 =   Expression.Lambda<Func<T, bool>>(binaryExpression2, parameterExpression);


   

【问题讨论】:

【参考方案1】:
Expression andExpression = Expression.AndAlso(binaryExpression1, binaryExpression2);

return Expression.Lambda<Func<T, bool>>(andExpression , parameterExpression);

编辑 - 评论

你只是把你所有的表达串联起来

so 为了得到这个表达式 X AND (Y OR (Z OR Q))

Expression ZorQ = Expression.OrElse(zExp, qExp);
Expression YorZorQ = Expression.OrElse(yExp, ZorQ);
Expression XandYorZorQ = Expression.AndAlso(xExp, YorZorQ);

【讨论】:

这行得通!还有一个问题,假设我想测试一些不是二进制的东西:X AND (Y OR Z OR Q),我也必须成对地做吗?

以上是关于如何构建具有多个条件的 Lambda 表达式树的主要内容,如果未能解决你的问题,请参考以下文章

具有嵌套属性的动态 linq 表达式树

Lambda表达式树构建(上)

关于Expression表达式树的拼接

构建动态表达式树以过滤集合属性

如何从字符串为深层属性创建表达式树/lambda

根据表达式树动态生成Lambda表达式