2011-06-09 20 views
18

Not: Bunu dinamik linq kullanarak oluşturmak çok kolay biliyorum ama öğrenmek istiyorum.Lambda İfade Ağacını Çoklu Koşullarla Nasıl Oluşturun

"Bulur" adlı bir lambda oluşturmak istiyorum: İsim = David VE Yaş = 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); 


    } 

cevap

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

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

Düzen - Sadece birlikte tüm expresions zincirle

açıklama

bu ifade X VE (Y OR (Z VEYA Q)) elde etmek için

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

bu işler! bir soru daha diyelim ki, ikili olmayan bir şeyi test etmek istiyorum: X VE (Y VEYA Z VEYA Q), çift-çifti de yapmalı mıyım? – jullin

+2

@jullin - güncellememi sorunuzu cevaplıyor mu? – Aducci

İlgili konular