2009-03-24 43 views
7

पैरामीटर बदलें मैं विस्तार विधि है। कुछ ऐसा होगा।लैम्ब्डा समारोह से लैम्ब्डा अभिव्यक्ति

public static IQueryable<TResult> WithFieldLike<TResult>(
    this IQueryable<TResult> query, 
    Expression<Func<TResult, string>> field, 
    string value) 
{ 
    Expression<Func<TResult, bool>> expr = ??? 
    return query.Where(expr); 
} 

इस विधि का आह्वान है:

var query7 = query.WithFieldLike(trans => trans.DeviceModelNumber, "ber_3"); 

मैं "expr" इस मामले में बनाने चाहिए कैसे? कृपया मदद करे।

+0

कृपया टैग के लिए भाषा जोड़ें। – Svante

उत्तर

6

deconstruct field और एक नया अभिव्यक्ति बनाने के लिए, कुछ इस तरह:

var expr = Expression.Lambda<Func<TResult, bool>> (
    Expression.Call (field.Body, typeof (string).GetMethod ("Contains"), 
     Expression.Constant (value)), field.Parameters) ; 

(टिप्पणी में Maxs के शोधन के अनुसार संपादित)

+0

मुद्दा यह है कि मैं "शामिल" अभिव्यक्ति नहीं बना सकता। मुझे पता है कि "बराबर" अभिव्यक्ति कैसे बनाएं। – Maxs

+0

ओह, क्षमा करें - संपादित उत्तर –

+0

धन्यवाद। यह पूरी तरह से काम करता है। – Maxs

1

उपयोग Compile वापस बाहर लैम्ब्डा पाने के लिए:

Expression<Func<TResult, bool>> expr = 
    trans => field.Compile()(trans).Contains(value); 

संपादित करें: ओह - मेरी हवा संकलक मुझे विफल रहा है। संकलन के बाद, आप प्रतिनिधि मिलते हैं। लेकिन, आपको अभी भी कॉल करने के लिए स्ट्रिंग प्राप्त करने के लिए इसे कॉल करने की आवश्यकता है।

+0

संकलन त्रुटि होगी: 'System.Func ' में 'कंटेनर' की परिभाषा नहीं है और 'System.Func ' प्रकार के पहले तर्क को स्वीकार करने वाली कोई एक्सटेंशन विधि 'शामिल नहीं है' पाया जा सकता है (क्या आप एक प्रयोग निर्देश या असेंबली संदर्भ खो रहे हैं?) – Maxs

+0

@ मैक्स: हाँ - मैं पूरी तरह से "इसे दूसरी अभिव्यक्ति में परिवर्तित" भाग खराब कर देता हूं। प्वाइंट खड़ा है - लैम्ब्डा प्राप्त करने के लिए संकलन का उपयोग करें, और इसे सामान्य के रूप में उपयोग करें। –

4

आप Expression.Invoke का उपयोग करना होगा; (Untested) की तरह कुछ:

public static IQueryable<TResult> WithFieldLike<TResult>(
    this IQueryable<TResult> query, 
    Expression<Func<TResult, string>> field, 
    string value) 
{ 
    var param = Expression.Parameter(typeof(TResult), "x"); 
    var expr = Expression.Lambda<Func<TResult, bool>>(
     Expression.Call(Expression.Invoke(field, param), 
      "Contains", null, Expression.Constant(value)), param); 

    return query.Where(expr); 
} 

(संपादित करें: निश्चित)

+1

धन्यवाद। यह भी काम करता है। लेकिन एडीओ.NET डेटा सेवा कॉल के साथ अभिव्यक्ति को असंगत बनाता है। – Maxs

+1

को लीकी एब्स्ट्रैक्शन के कानून से प्यार होना चाहिए ... यह कुछ के साथ काम करता है लेकिन सभी नहीं; -पी –

संबंधित मुद्दे