2013-04-24 5 views
9

मैं अपने एएसपी.नेट, सी #, वेब अनुप्रयोग में इकाई फ्रेमवर्क का उपयोग कर रहा हूं। अगर मुझे डेटाबेस (डेटा एक्सेस लेयर में) से एक रिकॉर्ड चुनने की ज़रूरत है, तो मुझे किस विधि का उपयोग करना चाहिए? लिंक पूछताछ या एक Lambda अभिव्यक्ति?लिंक क्वेरी या लैम्ब्डा अभिव्यक्ति?

उदाहरण के लिए: -

//Linq   
var result = from a in db.myTable.Take(1) where a.Id == varId select a; 
return result.First(); 

//Lambda 
return db.myTable.FirstOrDefault(a => a.Id == varId); 

वहाँ इस परिदृश्य या दूसरे के ऊपर किसी भी लाभ में किसी भी पसंदीदा तरीका है?

+5

जो भी आप चाहते हैं उसका उपयोग करें। (बीटीडब्ल्यू: वे एक ही काम नहीं कर रहे हैं) – I4V

+1

[LINQ - क्वेरी सिंटैक्स बनाम विधि श्रृंखला और लैम्ब्डा] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/8037677/linq-query-syntax-vs-method-chains -लैम्ब्डा) – I4V

उत्तर

14

प्रश्न अभिव्यक्ति विधि अभिव्यक्ति (लैम्ब्डा अभिव्यक्ति) में संकलित है, इसलिए आपके कोड में कोई अंतर नहीं होना चाहिए, हालांकि आप First और FirstOrDefault तक पहुंच रहे हैं जो अलग-अलग व्यवहार करेंगे।

देखें: Query Syntax and Method Syntax in LINQ (C#)

और LINQ Query Expressions (C# Programming Guide)

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

+2

एमएसडीएन लिंक के लिए +1 –

+0

आवंटन के बारे में क्या? – dariol

0

मुझे लगता है कि परिणाम वही है। Lambda बस थोड़ा और आरामदायक है। यदि आपको केवल एक तालिका के परिणाम की आवश्यकता है, तो लैम्ब्डा अभिव्यक्ति बहुत तेज और पठनीय है।

5

लिंक क्वेरी सिंटैक्स अभिव्यक्ति विधियों के लिए सिर्फ एक वाक्यविन्यास चीनी है। अभिव्यक्ति विधियों में संकलित कोई भी लिंक क्वेरी। Btw अपना पहला प्रश्न:

var query = from a in db.myTable.Take(1) 
      where a.Id == varId 
      select a; 
return query.First(); 

return db.myTable.Take(1).Where(a => a.Id == varId).First(); 
3
अपने की कोशिश करता Linq का उपयोग की

दोनों के बराबर है।

पहले एक रिकॉर्ड लेता है और आईडी मिलान करता है तो जांच करता है।

दूसरा पहला रिकॉर्ड लेता है जहां आईडी मेल खाता है।

यह एक अंतर है।

0

प्रत्येक क्वेरी अभिव्यक्ति को क्वेरी ऑपरेटरों को विस्तार विधियों के रूप में कॉल का उपयोग करके सी # -कोड के रूप में व्यक्त किया जा सकता है। लेकिन विपरीत सच नहीं है; मानक क्वेरी ऑपरेटरों का केवल एक छोटा सबसेट क्वेरी एक्सप्रेशन में कीवर्ड के रूप में उपयोग किया जा सकता है। दूसरे शब्दों में क्वेरी अभिव्यक्तियों में कुछ सीमाएं हैं जिनके पास विधि-कॉल तंत्र नहीं है:

  1. कुछ क्वेरी ऑपरेटरों के पास कोई सी # क्वेरी अभिव्यक्ति समतुल्य नहीं है, उदा। ToArray()।
  2. हम सी # के क्वेरी एक्सप्रेशन में सभी प्रकार के ओवरलोड का उपयोग नहीं कर सकते हैं। जैसे चयन() का एक अधिभार है जो वर्तमान में पुनरावृत्त ऑब्जेक्ट की अनुक्रमणिका का इंतजार कर रहा है; आप एक क्वेरी अभिव्यक्ति के भीतर इस अधिभार को कॉल नहीं कर सकते हैं।
  3. हम क्वेरी अभिव्यक्तियों में कथन lambdas का उपयोग नहीं कर सकते हैं। - यही कारण है कि ऑब्जेक्ट और संग्रह प्रारंभकर्ताओं को सी # भाषा में पेश किया गया है।
संबंधित मुद्दे