2009-04-29 20 views
9

आश्चर्य है कि LINQ "क्वेरी" वाक्यविन्यास अभिव्यक्ति के परिणामस्वरूप लैम्ब्डा अभिव्यक्तियों को प्राप्त करने का कोई तरीका है या नहीं।LINQ क्वेरी सिंटेक्स लैम्ब्डा

को देखते हुए:

var query = from c in dc.Colors 
      where c.ID == 213 
      orderby c.Name, c.Description 
      select new {c.ID, c.Name, c.Description }; 

वहाँ किसी भी तरह से उत्पन्न "लैम्ब्डा" कोड/अभिव्यक्ति पाने के लिए है?

var query = dc.Colors 
    .Where(c => c.ID == 213) 
    .OrderBy(c => c.Name) 
    .ThenBy(c => c.Description) 
    .Select(c => new {c.ID, c.Name, c.Description, }); 

मैं जानता हूँ कि ये बहुत सरल उदाहरण हैं और सी # संकलक जब कोड संकलन क्वेरी अभिव्यक्ति से एक लैम्ब्डा अभिव्यक्ति उत्पन्न करता है। क्या उस अभिव्यक्ति की प्रति प्राप्त करने का कोई तरीका है?

मैं अपने कुछ टीम सदस्यों के लिए एक प्रशिक्षण उपकरण के रूप में इसका उपयोग करने की उम्मीद कर रहा हूं जो लैम्ब्डा अभिव्यक्तियों के साथ बहुत सहज नहीं हैं। इसके अलावा, मैंने लिंक पैड का उपयोग किया है, लेकिन आदर्श रूप से इसे किसी तृतीय पक्ष टूल के बिना पूरा किया जा सकता है।

उत्तर

5

सीधे शब्दों में जाना:

string lambdaSyntax = query.Expression.ToString(); 

नुकसान LINQPad की तुलना में है कि परिणाम एक पंक्ति स्वरूपित है है।

+0

यह आपके असेंबली पर परावर्तक का उपयोग करके पाए गए लोगों के समान परिणाम उत्पन्न करता है। पागल नामित अज्ञात प्रकारों के खिलाफ सभी स्थिर विधि कॉल। आदर्श नहीं। – andleer

+0

यह प्रतिबिंबक में आप जो देखते हैं उससे बेहतर है - और यह उतना ही अच्छा है जितना आप तीसरे पक्ष के उपकरण के बिना प्राप्त करेंगे। –

+0

अपनी पुस्तक से प्यार करें। मैंने टीम के सदस्यों के लिए कुछ प्रतियां खरीदीं। – andleer

3

आप असेंबली संकलित करने और फिर परावर्तक का उपयोग करके इसे देखने का प्रयास कर सकते हैं।

यह आपकी अपेक्षा से थोड़ा अधिक जटिल हो सकता है, क्योंकि संकलक प्रत्यक्ष विधि कॉल पर सीधे चीजों को संकलित करेगा (सबकुछ स्थैतिक विधि कॉल होगा, विस्तार विधियों नहीं होगा, और भेड़ के बच्चे अपने आप में संकलित हो जाएंगे कार्य करता है जो आम तौर पर <ClassName>b_88f की तरह कुछ) कहा जाता है

आप निश्चित रूप से पता लगा लेंगे क्या हालांकि हो रहा है :-)

+0

परावर्तक एक अद्भुत उपकरण है! बोनस पॉइंट्स क्योंकि आप इसे किसी भी .NET असेंबली के लिए .net कोड देखने के लिए उपयोग कर सकते हैं। –

2

ReSharper कि सुविधा है। यह एक LINQ लेम्बाडा ले जाएगा और एक कुंजी के स्ट्रोक पर फिर से वापस ले जाएगा। अन्य चीजों के लिए भी बहुत (बहुत) उपयोगी है।

+0

वास्तव में तीसरे पक्ष के उपकरण से बचने की कोशिश कर रहा है। – andleer

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