2010-06-29 10 views
38

MSDN प्रलेखीकरण कहता है:LINQ की अभिव्यक्ति का उद्देश्य क्या है। त्वरित विधि?

Expression.Quote

विधि एक UnaryExpression कि एक अभिव्यक्ति प्रकार अभिव्यक्ति की एक निरंतर मूल्य है का प्रतिनिधित्व करता है बनाता है।

मैं अभिव्यक्ति वर्ग का उपयोग करके मैन्युअल रूप से उनका निर्माण करके LINQ क्वेरीज़ में उपयोग के लिए पूर्वानुमान अभिव्यक्तियों का निर्माण करने में सक्षम हूं, लेकिन अभिव्यक्ति की आवश्यकता पूरी नहीं हुई है। Quote।

आप इसका उपयोग कब और क्यों करेंगे? LINQ अभिव्यक्तियों से मैंने देखा है कि उनके पास है, वे किसी भी मूल्य को जोड़ने के बिना मौजूदा अभिव्यक्तियों को लपेटते हैं।

उद्धरण विधि/नोड प्रकार का उद्देश्य क्या है?

+0

"जब आप Expression.Call का उपयोग करके MethodCallExpression का निर्माण कर रहे हैं, तो लैम्ब्डा अभिव्यक्तियों (LambdaExpression/अभिव्यक्ति ) के किसी भी पैरामीटर को अभिव्यक्ति का उपयोग करना चाहिए। पास करने से पहले पैरामीटर को लपेटने के लिए उद्धरण।" क्या यह सच है? .NET 4.5 का उपयोग करके, मैं अभिव्यक्ति के साथ पहले उद्धरण की आवश्यकता के बिना नंगे अभिव्यक्ति > सफलतापूर्वक पारित करने में सक्षम हूं। –

+0

यदि आपका पैरामीटर 'Func <>' प्रकार है, तो सुनिश्चित करें कि आपको केवल इतना ही चाहिए, लेकिन कई LINQ 'IQueryable ' एक्सटेंशन विधियों के मामले में, पैरामीटर प्रकार वास्तव में 'अभिव्यक्ति >' है, और उस स्थिति में आपको 'Expression.Quote' की आवश्यकता होगी। मैंने .NET 4.5 के साथ ऐसा करने की कोशिश नहीं की है, लेकिन मुझे लगता है कि यह वही था। लिखने के समय मैं शायद .NET 3.5 का उपयोग कर रहा था। – GiddyUpHorsey

उत्तर

23

Expression.Quote निर्दिष्ट करता है कि एक लैम्ब्डा को एक अभिव्यक्ति वृक्ष के रूप में माना जाना चाहिए, न कि एक समारोह के रूप में। यह अपने ऑपरेंड पर बंद अर्थशास्त्र को प्रेरित करता है।

जब आप एक MethodCallExpressionExpression.Call का उपयोग कर निर्माण कर रहे हैं, किसी भी पैरामीटर लैम्ब्डा भाव (LambdaExpression/Expression<TDelegate>), Expression.Quote का उपयोग में पार करने से पहले पैरामीटर रैप करने के लिए आवश्यक है।

तो प्रकार Expression<Func<bool>> की एक पैरामीटर के लिए जब आप बना रहे हैं एक उदाहरण के रूप में: () => true, अभिव्यक्ति की Type संपत्ति जबकि अभिव्यक्ति के प्रकार (GetType बुला) Func<bool> होगा Expression<Func<bool>>

तो एकप्राप्त करने के लिए किया जाएगाजिसमें Type संपत्ति के लिए सही मान है, आप Expression.Quote में लैम्ब्डा अभिव्यक्ति को पास करते हैं और Expression.Call पर पैरामीटर के रूप में पास करते हैं।

मैं परावर्तक के माध्यम से Expression.Quote पर एक नज़र था और जबकि एकमात्र पैरामीटर प्रकार Expression की है, यह LambdaExpression से निकाले जाते हैं चाहिए और इस विधि के अंदर चेक किया गया है। ब्याज से, किसी को पता है कि एमएस ने पैरामीटर प्रकार को LambdaExpression क्यों नहीं बनाया?

स्टीवनएच ने बताया, Expression.Quote का उपयोग LINQ क्वेरी प्रदाता को लागू करने में किया जाता है। Queryable पर सभी तरीकों कि एक लैम्ब्डा अभिव्यक्ति इस तरह के Where, OrderBy, GroupBy, आदि के रूप में आंतरिक रूप से Expression.Call का उपयोग कर एक MethodCallExpression का निर्माण और Expression.Quote कॉल के साथ लैम्ब्डा अभिव्यक्ति मापदंडों लपेट ले।

Expression.Quote के एक और विस्तृत स्पष्टीकरण के लिए यह answer पढ़ें।