2011-10-02 17 views
5

मैं एक विधेय Expression<Func<T1, bool>>Linq - अभिव्यक्ति से अभिव्यक्ति <T1> बनाना <T2>

है मैं एक विधेय Expression<Func<T2, bool>> के रूप में उपयोग करने के लिए T2 की T1 संपत्ति का उपयोग कर मैंने कई approches बारे में सोचने की कोशिश कर रहा था, शायद Expression.Invoke लेकिन couln का उपयोग कर की जरूरत है; मेरे चारों ओर मेरा सिर नहीं मिलता है।

संदर्भ के लिए:

class T2 { 
    public T1 T1; 
} 

और

Expression<Func<T1, bool>> ConvertPredicates(Expression<Func<T2, bool>> predicate) { 
    //what to do here... 
} 

धन्यवाद अग्रिम में एक बहुत।

उत्तर

7

अभिव्यक्ति पेड़ों के बारे में सोचने से पहले सामान्य लैम्ब्डा के साथ समाधान खोजने का प्रयास करें।

आप एक विधेय

Func<T1, bool> p1 

है और एक विधेय चाहते

Func<T2, bool> p2 = (x => p1(x.T1)); 

इस प्रकार आप एक अभिव्यक्ति पेड़ के रूप में इस का निर्माण कर सकते हैं:

Expression<Func<T2, bool>> Convert(Expression<Func<T1, bool>> predicate) 
{ 
    var x = Expression.Parameter(typeof(T2), "x"); 
    return Expression.Lambda<Func<T2, bool>>(
     Expression.Invoke(predicate, Expression.PropertyOrField(x, "T1")), x); 
} 
+0

यह प्रीफेक्ट, धन्यवाद है! – Variant