2009-03-10 15 views
54

मैं सामान्य रूप से LINQ का उपयोग करना शुरू कर रहा हूं (अब तक toXML और toSQL)। मैंने देखा है कि कभी-कभी एक ही परिणाम प्राप्त करने के दो या दो से अधिक तरीके होते हैं। इस सरल उदाहरण लें, जहाँ तक मैं समझता हूँ कि दोनों बिल्कुल वही बात लौटने:LINQ: डॉट नोटेशन बनाम क्वेरी अभिव्यक्ति

SomeDataContext dc = new SomeDataContext(); 

var queue = from q in dc.SomeTable 
     where q.SomeDate <= DateTime.Now && q.Locked != true 
     orderby (q.Priority, q.TimeCreated) 
     select q; 

var queue2 = dc.SomeTable 
     .Where(q => q.SomeDate <= DateTime.Now && q.Locked != true) 
     .OrderBy(q => q.Priority) 
     .ThenBy(q => q.TimeCreated); 

किसी भी गलती मैं वाक्य रचना या एक लापता पैरामीटर या अंतर में की गई हो सकता है इसके अलावा, विचार वहाँ के दो तरीके हैं वह यह है कि एक ही बात व्यक्त करें; मैं समझता हूं कि पहली विधि में कुछ सीमाएं हैं और "डॉट नोटेशन" अधिक पूर्ण है, लेकिन इसके अलावा, क्या कोई अन्य फायदे हैं?

+0

प्रतिक्रियाओं के लिए सभी को धन्यवाद। हां, मैं केवल सही उत्तर के रूप में चिह्नित कर सकता हूं। लेकिन मैं सभी टिप्पणियों की सराहना करता हूं। –

+1

डुप्लिकेट: http://stackoverflow.com/questions/214500/which-linq-syntax-do-you-prefer-fluent-or-query-expression – Mikhail

उत्तर

48

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

मैं 10 डेवलपर्स की एक टीम पर काम करता हूं और हम इस बात पर बहस करते हैं कि हमें मानक के रूप में उपयोग करना चाहिए। आम तौर पर, अधिक अनुभवी (LINQ के साथ) डेवलपर लैम्ब्डा सिंटैक्स की ओर माइग्रेट करते हैं लेकिन महत्वपूर्ण अपवाद हैं।

लैम्बडा अधिक संक्षिप्त है लेकिन एकाधिक तालिका में शामिल होने से एक दुःस्वप्न है। जॉइन क्वेरी सिंटैक्स के साथ बहुत अधिक क्लीनर हैं। फ्लिप पक्ष यह है कि कई LINQ ऑपरेशंस हैं जो केवल लैम्ब्डा सिंटैक्स के भीतर मौजूद हैं: एकल(), प्रथम(), गणना() आदि

तो, जो आप सबसे अधिक आरामदायक महसूस करते हैं और इसका एहसास करते हैं आपको अनुभव मिलता है, आपकी वरीयता बदल जाएगी। दोनों को पढ़ने में सक्षम होने में बहुत बढ़िया मूल्य है और निश्चित रूप से ऐसी स्थितियां होंगी जहां आपको दोनों का थोड़ा सा उपयोग करना होगा। अन्य परिस्थितियों में एक दूसरे के ऊपर एक शैली में उन्हें उधार देगा। अंत में, यह सब एक ही निष्पादन योग्य कोड में अनुवादित हो जाता है।

+1

5 साल बाद और विधि-जंजीर लैम्ब्डा सिंटैक्स को अब आमतौर पर [फ्लुएंट इंटरफेस] (http://en.wikipedia.org/wiki/Fluent_interface) के रूप में जाना जाता है। – Nick

8

ठीक है, 'डॉट' नोटेशन बहुत छोटा हो सकता है। लें:

var result = from p in dc.Products 
      where p.Id > 5 
      select p; 

या:

var result = dc.Products.Where(p => p.Id > 5); 

मैं उत्तरार्द्ध पसंद करते हैं, क्योंकि यह बहुत कम है, और अधिक पठनीय है।

+0

LINQ से SQL का उपयोग करते समय मैं पूर्व को प्राथमिकता देता हूं क्योंकि यह टी- एसक्यूएल (जो डीबी प्रश्न लिखते समय आसान है) और बाद में अन्य LINQ प्रश्नों (जैसे LINQ से XML) के लिए। – RobS

+0

हां, आपके पास एक बिंदु है। Linq2sql के साथ मैं अक्सर पहले संस्करण का उपयोग करता हूं, उसी कारण से आप उल्लेख करते हैं। हालांकि मुझे यह भी स्वीकार करना होगा कि ऊपर दिए गए जैसे बहुत ही सरल प्रश्नों के लिए, मैं अक्सर दूसरे, छोटे संस्करण का उपयोग करता हूं, क्योंकि मैं आलसी हूं :-) – Razzie

+0

यह हमेशा छोटा नहीं होता है, और कभी-कभी इसे पढ़ने में मुश्किल होती है, लेकिन आपके पास इंगित करें कि यह थोड़ा छोटा हो सकता है। –

2

वे एक ही कोड को संकलित करते हैं, या बल्कि पहले व्यक्ति को दूसरे में अनुवादित किया जाता है और फिर संकलित किया जाता है।

आप सही हैं कि अंतर यह है कि पहला संस्करण क्लीनर है लेकिन अधिक सीमित है। दूसरा उदाहरण के लिए पहले से ही विद्यमान प्रतिनिधियों उपयोग कर सकते हैं, उदा .:

Func<int, bool> isEven = i => i%2 == 0; 
Enumerable.Range(10).Where(isEven).ToList().ForEach(Console.WriteLine); 
+0

पूरी तरह से सच नहीं है। आप अभी भी एक एक्सिसिटिंग प्रतिनिधि का उपयोग कर सकते हैं, उदाहरण के लिए: var परिणाम = सूची में से जहां भी है। इन्वोक (एस। लम्बाई) एस का चयन करें; – Razzie

+0

हां, लेकिन शैली के बारे में बात करना * .वॉवोक बस बदसूरत है :) – user76035

+1

आपको इनवॉक का उपयोग करने की आवश्यकता नहीं है, यह ठीक काम करता है: var result = मैं इनट्स में जहां से भी हूं (i) I का चयन करें; – theburningmonk

27

मैं केस-दर-मामले आधार पर, मेरी क्वेरी के लिए जो भी वाक्यविन्यास अधिक पठनीय है, का उपयोग करता हूं।

जहां संभव हो, मैं मिश्रण और दो मिलान से बचने के लिए, हालांकि कभी कभी यह ठीक है (अगर यह एक प्रश्न के अंत में First() को एक कॉल है, उदाहरण के लिए) का प्रयास करें। आस्थगित निष्पादन मतलब है कि यह एक प्रश्न अभिव्यक्ति का उपयोग करें और एक चर के लिए परिणाम असाइन करें, और उसके बाद का उपयोग कर डॉट नोटेशन उपयोग करने के लिए बस के रूप में कुशल है कि चर:

var query = from x in y 
      orderby z 
      group x by x.Name into groups 
      // etc 
      select foo; 

var page = query.Skip(50).Take(10); 

के रूप में अन्य लोगों ने कहा, क्वेरी भाव बस में अनुवाद कर रहे हैं " सामान्य "सी # 3 क्वेरी एक्सप्रेशन के बिना, इसलिए ऐसा करने के लिए कोई दंड नहीं है।

+3

दो बार विभाजित करने के लिए फिर से +1 करें, जब आप पहले कोष्ठक में लपेटने और अंत में बाकी को संभालने के बजाय उन्हें एक साथ उपयोग करना चाहते हैं। – Shibumi

3

मुझे लैम्ब्डा नोटेशन नीदर और अधिक संक्षिप्त लगता है।मुझे बस यह परेशान लगता है कि यदि आपके पास लैम्ब्डा अभिव्यक्ति कहीं भी विधि कॉल के अंदर है, तो आप डीबग मोड में फ्लाई पर कोड संशोधित नहीं कर सकते हैं ...

+0

यदि आप क्वेरी एक्सप्रेशन का उपयोग कर रहे हैं तो संपादन और जारी रखें क्या काम करता है? –

+0

@MichaelFreidgeim - संख्या :-) इस उत्तर को लिखने के बाद से 2 वर्षों में मैंने जो चीजें खोजीं उनमें से एक। –

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