简体   繁体   English

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

[英]How Build Lambda Expression Tree with multiple conditions

Note: I know it's much simple to create this using dynamic linq but I want to learn.注意:我知道使用动态 linq 创建它非常简单,但我想学习。

I want to create a lambda that "finds": Name=David AND Age=10.我想创建一个“发现”的 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);


   }
Expression andExpression = Expression.AndAlso(binaryExpression1, binaryExpression2);

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

Edit - comment编辑 - 评论

You just chain together all your expresions你只是把你所有的表达联系在一起

so in order to get this expression X AND (Y OR (Z OR Q))所以为了得到这个表达式 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);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM