2008-10-10 5 views
7

जब मैं System.Linq namespace आयात करने के बाद 'से' टाइप करता हूं (LINQ क्वेरी में), इसे एक कीवर्ड के रूप में समझा जाता है। यह जादू कैसे होता है?LINQ और C# में हुड के तहत 'कीवर्ड/से चुनें/चुनें' कीवर्ड कैसे लगाया जाता है?

कुछ प्रकार से एक एक्सटेंशन विधि 'से' है?

उत्तर

6

प्रैक्टिस में, हाँ - LINQ कीवर्ड विस्तार विधियों के लिए मानचित्र। लेकिन वास्तव में, यह और अधिक दिलचस्प है; यह सचमुच है जैसे कि कुछ महत्वपूर्ण तरीकों के लिए सीधे संकलक विकल्प, यानी

var qry = from cust in db.Customers 
      where cust.IsActive 
      select cust; 

हो जाता है:

var qry = db.Customers.Where(cust => cust.IsActive); 

(अगर हम एक गैर तुच्छ का चयन करें, यह .Select जोड़ना होगा (था .. .कुछ प्रक्षेपण ...)

अलग अलग तरीकों के LINQ kewords मानचित्र - यानी OrderBy, GroupBy, ThenBy, OrderByDescending, आदि

के मामले में वहाँ है/IQueryable<T>, इस तो विस्तार विधियों के माध्यम से इन का समाधान करता है (आमतौर पर Enumerable/Queryable के सौजन्य से) - हालांकि, अपने queryable वस्तुओं के लिए अपने स्वयं घोषित करता है, तो कहाँ/OrderBy/आदि तो इन वरीयता में आदत हो जाएगी।

जॉन स्कीट C# in Depth के उत्तरार्द्ध भागों में इस एक बहुत अधिक शामिल हैं। मैंने an example of Jon's भी देखा है जहां उन्होंने इस बारे में कुछ वास्तव में विचित्र प्रभावों पर चर्चा की - जैसे किसी प्रकार पर स्थैतिक विधियों को कॉल करना।

+0

चयन छोड़ना() सिर्फ एक अनुकूलन है। इसे अभी भी एक चयन() की आवश्यकता होती है जब भी यह चयन करने के लिए एक कॉल है (x => x); –

+0

हां, लेकिन यह एक अनुकूलन है जो यह करता है। यदि आपके पास "var qry = x x x x x में x से" है, तो यह चयन छोड़ देगा - यानी "var qry = y.Select (x => x)" बन जाता है - हालांकि, अन्य कई सामान्य सरल मामलों में इसे छोड़ देंगे (जब तक कि आपके पास एक गैर-मामूली प्रक्षेपण न हो)। –

-1

"से" एक भाषा कीवर्ड है (जैसे "अगर" या "foreach")।

तुम भी "से" का उपयोग करने System.Linq आयात करने की आवश्यकता नहीं है, लेकिन आप 3.5 ढांचे का उपयोग करने की आवश्यकता है।

+0

आपको 3.5 ढांचे की भी आवश्यकता नहीं है - आपको केवल विधियों के उपयुक्त सेट की आवश्यकता है। उदाहरण के लिए, LINQBridge .NET 2.0 के विरुद्ध काम करता है, और आप इसके खिलाफ सी # 3.0 लिख सकते हैं। –

+0

नहीं, आप नहीं करते हैं। आपको सी # 3.0 की आवश्यकता है, जो एक ही बात नहीं है। LINQBridge, उदाहरण के लिए, LINQ-to-Objects को .NET 2.0 में C# 3.0 के साथ लाता है। –

+0

"से" एक भाषा कीवर्ड नहीं है। यह एक संदर्भ-निर्भर वाक्यविन्यास तत्व है। अंतर तब स्पष्ट हो जाता है जब आप महसूस करते हैं कि आप "से" (बिना @ के) के चर का नाम दे सकते हैं, लेकिन आप एक चर "if" या "foreach" नाम नहीं दे सकते (जब तक कि आप कोई नहीं जोड़ते)। – Timwi

4

मार्क ग्रेवल answered the question admirably है, लेकिन मैं weird things you can do with query expressions का उल्लेख करने के लिए प्रलोभन का विरोध नहीं कर सकता। संकलक वास्तव में बहुत ज्यादा है कि यह कैसे पाता है एक "चुनें" सदस्य परवाह नहीं करता, या "कहाँ" आदि कि

रास्ता संकलक करने से पहले में कोड अनुवाद "# 3.0 सी क्वेरी भाव के बिना" सामान्य संकलन वास्तव में है सुंदर - यह भाषा में नई कार्यक्षमता को पेश करने का एक शानदार तरीका है, लेकिन विनिर्देश के एक अलग हिस्से में केवल प्रभाव पड़ता है।

+0

पहले से ही ;-p में यह जुड़ा हुआ (मैं बस कुछ ही सेकंड की जरूरत यह ट्रैक करने के लिए नीचे ...) –

+0

और मार्क और जॉन डबल अधिनियम में अगले आज ... –

+0

"अपने अनुकूल टैग टीम MVPs" ;-p –