धाराप्रवाह और क्वेरी अभिव्यक्ति - क्या एक दूसरे के ऊपर कोई लाभ है?


255

LINQ जेनेरिक के बाद से .NET में सबसे महान सुधारों में से एक है और यह मुझे कई टन और कोड की लाइनें बचाता है। हालाँकि, क्वेरी सिंटैक्स सिंटैक्स की तुलना में धाराप्रवाह सिंटैक्स मेरे लिए अधिक स्वाभाविक है।

var title = entries.Where(e => e.Approved)
    .OrderBy(e => e.Rating).Select(e => e.Title)
    .FirstOrDefault();

var query = (from e in entries
             where e.Approved
             orderby e.Rating
             select e.Title).FirstOrDefault();

क्या दोनों के बीच कोई अंतर है या एक दूसरे पर कोई विशेष लाभ है?


1
जटिल प्रश्नों के लिए, मुझे लैम्ब्डा सिंटैक्स अधिक समझने योग्य / पठनीय लगता है, लेकिन क्वेरी सिंटैक्स केवल प्रेटियर है।
नवफाल

जवाबों:


255

न तो बेहतर है: वे विभिन्न आवश्यकताओं की सेवा करते हैं। जब आप एक से अधिक श्रेणी चर का लाभ लेना चाहते हैं तो क्वेरी सिंटैक्स अपने आप आता है । यह तीन स्थितियों में होता है:

  • लेट कीवर्ड का उपयोग करते समय
  • आप (कई जनरेटर है जब से खंड)
  • जब जॉइन कर रहे हो

यहाँ एक उदाहरण है (LINQPad नमूने से):

string[] fullNames = { "Anne Williams", "John Fred Smith", "Sue Green" };

var query =
  from fullName in fullNames
  from name in fullName.Split()
  orderby fullName, name
  select name + " came from " + fullName;

अब इसकी तुलना सिंटैक्स में उसी चीज़ से करें:

var query = fullNames
  .SelectMany (fName => fName.Split().Select (name => new { name, fName } ))
  .OrderBy (x => x.fName)
  .ThenBy  (x => x.name)
  .Select  (x => x.name + " came from " + x.fName);

दूसरी ओर विधि सिंटैक्स, क्वेरी ऑपरेटरों के पूर्ण सरगम ​​को उजागर करता है और सरल प्रश्नों के साथ अधिक संक्षिप्त है। क्वेरी और विधि सिंटैक्स को मिला कर आप दोनों दुनिया का सर्वश्रेष्ठ प्राप्त कर सकते हैं। यह अक्सर LINQ में SQL प्रश्नों के लिए किया जाता है:

var query =
  from c in db.Customers
  let totalSpend = c.Purchases.Sum (p => p.Price)    // Method syntax here
  where totalSpend > 1000
  from p in c.Purchases
  select new { p.Description, totalSpend, c.Address.State };

2
अच्छा उत्तर। क्या आप मुझे थोड़ा और बता सकते हैं कि ".Select (नाम => नया {नाम, fName})" क्या है?
क्विलब्रेकर

12
यह एक गुमनाम प्रकार में पूरे नाम के साथ व्यक्तिगत शब्द (एनी, विलियम्स, जॉन, आदि) का चयन करता है। यह आपको मूल पूर्ण नाम को "ले जाने" की अनुमति देता है ताकि आपके पास शेष क्वेरी में पूर्ण नाम और व्यक्तिगत शब्द दोनों तक पहुंच हो।
जो अलबहारी

58

जब मैं पूरी अभिव्यक्ति को इस तरह लिख सकता हूं, तो मैं बाद वाले (कभी-कभी "क्वेरी कॉम्प्रिहेंशन सिंटैक्स") का उपयोग करना पसंद करता हूं।

var titlesQuery = from e in entries
                  where e.Approved
                  orderby e.Rating
                  select e.Titles;

var title = titlesQuery.FirstOrDefault();

जैसे ही मुझे (कोष्ठक) जोड़ना होगा और .MethodCalls() , मैं बदलता हूं।

जब मैं पूर्व का उपयोग करता हूं, तो मैं आमतौर पर प्रति पंक्ति एक खंड इस तरह डालता हूं:

var title = entries
    .Where (e => e.Approved)
    .OrderBy (e => e.Rating)
    .Select (e => e.Title)
    .FirstOrDefault();

मुझे लगता है कि पढ़ने में थोड़ा आसान है।


29

प्रत्येक शैली में उनके पेशेवरों और विपक्ष हैं। जब यह जुड़ने की बात आती है तो क्वेरी सिंटैक्स अच्छा होता है और इसमें उपयोगी लेट कीवर्ड होता है जो क्वेरी के अंदर अस्थायी चर बनाता है।

दूसरी ओर धाराप्रवाह सिंटैक्स में बहुत अधिक विधियां और संचालन होते हैं जो क्वेरी सिंटैक्स के माध्यम से उजागर नहीं होते हैं। इसके अलावा, क्योंकि वे सिर्फ विस्तार विधियाँ हैं जिन्हें आप स्वयं लिख सकते हैं।

मैंने पाया है कि हर बार जब मैं क्वेरी सिंटैक्स का उपयोग करके एक लाइनक्यू स्टेटमेंट लिखना शुरू करता हूं, तो मैं इसे कोष्ठक में डाल देता हूं और धाराप्रवाह लाइनक्यू एक्सटेंशन विधियों का उपयोग करके वापस गिर जाता हूं। क्वेरी सिंटैक्स में केवल अपने द्वारा उपयोग की जाने वाली पर्याप्त सुविधाएँ नहीं हैं।


"चूंकि वे सिर्फ विस्तार के तरीके हैं, आप अपना खुद का लिख ​​सकते हैं।" - क्या आप इस समस्या में भागेंगे? stackoverflow.com/a/3850254/1175496
लाल मटर

20

में VB.NET मैं बहुत ज्यादा क्वेरी सिंटैक्स पसंद करते हैं।

मुझे बदसूरत Function-कॉबर्ड को दोहराने से नफरत है :

Dim fullNames = { "Anne Williams", "John Fred Smith", "Sue Green" };
Dim query =
     fullNames.SelectMany(Function(fName) fName.Split().
     Select(Function(Name) New With {Name, fName})).
     OrderBy(Function(x) x.fName).
     ThenBy(Function(x) x.Name).
     Select(Function(x) x.Name & " came from " & x.fName)

यह स्वच्छ प्रश्न मेरे विचार से बहुत अधिक पठनीय और सुगम है:

query = From fullName In fullNames
        From name In fullName.Split()
        Order By fullName, name
        Select name & " came from " & fullName

VB.NET की क्वेरी सिंटैक्स C # की तुलना में अधिक शक्तिशाली और कम क्रिया है: https://stackoverflow.com/a/6515130/284240

उदाहरण के लिए इस LINQ से डेटासेट (ऑब्जेक्ट) क्वेरी

VB.NET:

Dim first10Rows = From r In dataTable1 Take 10

सी#:

var first10Rows = (from r in dataTable1.AsEnumerable() 
                   select r)
                   .Take(10);

9
उन VB डेवलपर्स के लिए मेरी सहानुभूति है, जो क्वेरी शैली का उपयोग नहीं कर सकते।
नवफाल

1
आपका अंतिम C # उदाहरण मूल्यवान होने के लिए बहुत सरल है: आप बस `dataTable1.AsEnumable () लिखेंगे। (10) लें;
एमिर

@Emyr: मेरा अंतिम पैराग्राफ जो "VB.NET के क्वेरी सिंटैक्स के साथ शुरू होता है, वह C # की तुलना में अधिक शक्तिशाली और कम क्रिया है" बस VB.NET के क्वेरी सिंटैक्स की C # से तुलना कर रहा है, आप विधि सिंटैक्स का उपयोग कर रहे हैं।
टिम श्मेल्टर

15

मुझे क्वेरी सिंटैक्स बिल्कुल नहीं मिलता है। मेरे मन में इसका कोई कारण नहीं है। चलो के साथ acheived किया जा सकता है। चयन और गुमनाम प्रकार। मुझे लगता है कि चीजें वहां "विराम चिह्न" के साथ और अधिक व्यवस्थित दिखती हैं।


9
धाराप्रवाह सिंटैक्स के साथ कई जॉइन काफी श्रमसाध्य हो सकते हैं। मैं आम तौर पर अपने आप को धाराप्रवाह उपयोग करता हूं - जब तक कि इसमें शामिल नहीं होता है।
रोमन स्टार्कोव

1
@ इनस्टेंस हंटर: यहाँ भी। धाराप्रवाह वाक्य रचना के विचार को समझने के लिए मुझे काफी समय लग गया। शक्तिशाली गणना करने योग्य और "शुद्ध" कार्यों के विचार के साथ संयोजन में, मैं अब वास्तव में इसका आनंद लेता हूं, और पूर्व में मुश्किल परिस्थितियों का कोई अच्छा प्रतिनिधित्व नहीं था। मस्तिष्क के तु-ओले-एसक्यूएल-भाग के लिए, यह अभी भी क्वेरी सिंटैक्स के लिए एक आशीर्वाद है।
ज़ान-कुन क्लार्क-डेविस

13

धाराप्रवाह इंटरफ़ेस अगर वहाँ सिर्फ एक कहाँ है। अगर मुझे किसी चुनिंदा या ऑर्डरबी की जरूरत है, तो मैं आमतौर पर क्वेरी सिंटैक्स का उपयोग करता हूं।


8

फ्लुएंट सिंटैक्स वास्तव में अधिक शक्तिशाली प्रतीत होता है, कोड को छोटे पुन: प्रयोज्य तरीकों में व्यवस्थित करने के लिए भी बेहतर काम करना चाहिए।


5

मुझे पता है कि यह प्रश्न C # के साथ टैग किया गया है, लेकिन धाराप्रवाह सिंटैक्स VB.NET के साथ दर्दनाक रूप से क्रिया है।


4

मुझे वास्तव में फ्लुएंट सिंटैक्स पसंद है और मैं इसका उपयोग करने की कोशिश करता हूं जहां मैं कर सकता हूं, लेकिन कुछ मामलों में, उदाहरण के लिए जहां मैं जॉइन करता हूं, मैं आमतौर पर क्वेरी सिंटैक्स पसंद करता हूं, उन मामलों में मुझे पढ़ना आसान लगता है, और मुझे लगता है कि कुछ लोग लैम्बदास की तुलना में क्वेरी (एसक्यूएल-जैसे) सिंटैक्स से अधिक परिचित हैं।


4

जबकि मैं समझता हूं और धाराप्रवाह प्रारूप को पसंद करता हूं, मैं समय के लिए पठनीयता कारणों से अटक गया हूं। लोगों को सिर्फ LINQ से परिचित कराया जा रहा है, यह पढ़ने के लिए बहुत अधिक आरामदायक होगा।


4

मैं क्वेरी सिंटैक्स पसंद करता हूं क्योंकि मैं SQL का उपयोग करके पारंपरिक वेब प्रोग्रामिंग से आया था। मेरे लिए अपने सिर को चारों ओर लपेटना बहुत आसान है। हालाँकि, ऐसा लगता है कि मैं इसका उपयोग करना शुरू कर दूंगा। (लंबोदर) क्योंकि यह निश्चित रूप से बहुत छोटा है।


4

मैं अब लगभग 6 महीने से Linq का उपयोग कर रहा हूँ। जब मैंने पहली बार इसका उपयोग शुरू किया तो मैंने क्वेरी सिंटैक्स को प्राथमिकता दी क्योंकि यह टी-एसक्यूएल के समान है।

लेकिन, मैं धीरे-धीरे अब पूर्व की ओर आ रहा हूं, क्योंकि विस्तार विधियों के रूप में कोड के पुन: प्रयोज्य टुकड़े लिखना आसान है और बस उन्हें एक साथ श्रृंखलाबद्ध करना है। हालाँकि मुझे लगता है कि प्रत्येक खंड को अपनी पंक्ति में रखने से पठनीयता में बहुत मदद मिलती है।


3

मैंने अभी-अभी अपनी कंपनी के मानक स्थापित किए हैं और हम विस्तार विधियों के उपयोग को लागू करते हैं। मुझे लगता है कि यह एक अच्छा विचार है कि एक दूसरे को चुनें और उन्हें कोड में न मिलाएं। एक्सटेंशन के तरीके अन्य कोड की तरह अधिक पढ़े जाते हैं।

कॉम्प्रिहेंशन सिंटैक्स में सभी ऑपरेटर नहीं होते हैं और क्वेरी के चारों ओर कोष्ठक का उपयोग करते हैं और एक्सटेंशन विधियों को जोड़ते हैं, बस शुरू से एक्सटेंशन विधियों का उपयोग करने के लिए मुझसे भीख माँगते हैं।

लेकिन अधिकांश भाग के लिए यह कुछ अपवादों के साथ सिर्फ व्यक्तिगत पसंद है।


3
मैं व्यक्तिगत प्राथमिकताओं को लागू नहीं करूंगा .. लेकिन यह मुझे है।
मेमेत ऑलसेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.