.NET सिलेक्ट (मैप) और एग्रीगेट (घटाना) के नामकरण के पीछे क्या कारण है?


17

अन्य प्रोग्रामिंग भाषाओं में, मैंने मैप और रिड्यूस देखा है, और वे कार्यात्मक प्रोग्रामिंग के कोनेस्टोन हैं। मुझे कोई तर्क या इतिहास नहीं मिला कि LINQ के पास Aggregate(समान Reduce) और Select(समान के रूप में Map) क्यों है?

मैं क्यों पूछ रहा हूं कि मुझे यह समझने में थोड़ा समय लगा कि यह वही है और मैं उत्सुक हूं कि इसके लिए क्या तर्क है।




दूसरी ओर, मैं नामकरण चयन "मैप" और एकत्रीकरण "कम" करने के पीछे के तर्क को जानना पसंद करूंगा।
डेन

जवाबों:


32

यह ज्यादातर LINQ के इतिहास में आता है।

LINQ को मूल रूप से SQL की तरह इस्तेमाल करने का इरादा था , और SQL डेटाबेस से जुड़ने के लिए (काफी हद तक, हालांकि विशेष रूप से नहीं) इस्तेमाल किया गया था । इसके कारण इसकी बहुत सी शब्दावली SQL पर आधारित है।

तो, "चुनें" एसक्यूएल से आया selectबयान, और "कुल" एसक्यूएल कुल कार्यों से आया है (जैसे, count, sum, avg, min, max)।

उन लोगों के लिए जो डिग्री पर प्रश्न करते हैं कि LINQ मूल रूप से SQL से संबंधित है, मैं उदाहरण के लिए (उदाहरण के लिए) C a पर Microsoft के लेखों का उल्लेख करूँगा, जो Microsoft अनुसंधान द्वारा तैयार की गई भाषा थी, और ऐसा प्रतीत होता है जहाँ LINQ की अधिकांश मूल बातें काम की थीं इससे पहले कि वे C # और .NET में जोड़े गए।

उदाहरण के लिए, Cω पर एक MSDN लेख पर विचार करें , जो कहता है:

Cω में क्वेरी ऑपरेटर

C क्वेरी ऑपरेटरों के दो व्यापक वर्गों को C # भाषा में जोड़ता है:
- XPath- आधारित ऑपरेटर किसी ऑब्जेक्ट के सदस्य चर को नाम या प्रकार से क्वेरी करने के लिए।
- एक या एक से अधिक वस्तुओं से प्रक्षेपण, समूहन, और डेटा से जुड़ने वाले परिष्कृत प्रश्नों को करने के लिए SQL- आधारित ऑपरेटर।

कम से कम जहां तक ​​मुझे पता है, XPath- आधारित ऑपरेटरों को कभी भी C # में नहीं जोड़ा गया था, केवल उन ऑपरेटरों को छोड़ दिया गया था जो कि सीधे (LINQ से पहले मौजूद थे) SQL पर सीधे आधारित थे।

अब, यह निश्चित रूप से सच है कि LINQ C it's में SQL- आधारित क्वेरी ऑपरेटरों के समान नहीं है। विशेष रूप से, LINQ C # की मूल वस्तुओं का अनुसरण करता है और फ़ंक्शन सिंटैक्स को C LIN की तुलना में अधिक निकटता से बुलाता है। C प्रश्नों ने SQL सिंटैक्स का और भी अधिक बारीकी से पालन किया, इसलिए आप कुछ इस तरह लिख सकते थे (फिर, ऊपर दिए गए लेख से सीधे खींचा गया):

 rows = select c.ContactName, o.ShippedDate
      from c in DB.Customers
      inner join o in DB.Orders
      on c.CustomerID == o.CustomerID;

और हाँ, वही लेख वास्तविक SQL डेटाबेस से आने वाले डेटा को क्वेरी करने के लिए SQL- आधारित क्वेरी का उपयोग करने के बारे में विशेष रूप से बात करता है:

Cω में SQL डेटाबेस से कनेक्ट करने के लिए, इसे एक प्रबंधित असेंबली (यानी, .NET लाइब्रेरी फ़ाइल) के रूप में उजागर किया जाना चाहिए, जिसे तब एप्लिकेशन द्वारा संदर्भित किया जाता है। Visual Studio के भीतर से sql2comega.exe कमांड लाइन टूल या Add डेटाबेस स्कीमा ... डायलॉग का उपयोग करके किसी रिलेशनल डेटाबेस को C be को प्रबंधित असेंबली के रूप में दिखाया जा सकता है । डेटाबेस ऑब्जेक्ट का उपयोग Cω सर्वर द्वारा होस्ट किए गए रिलेशनल डेटाबेस का प्रतिनिधित्व करने के लिए करते हैं। एक डाटाबेस वस्तु हर तालिका या देखने के लिए, और प्रत्येक मेज-मान समारोह डेटाबेस में पाया के लिए एक विधि के लिए एक सार्वजनिक संपत्ति है। संबंधपरक डेटाबेस को क्वेरी करने के लिए, एक तालिका, दृश्य या तालिका-मूल्यवान फ़ंक्शन को SQL- आधारित ऑपरेटरों के एक या अधिक इनपुट के रूप में निर्दिष्ट किया जाना चाहिए।

निम्न नमूना कार्यक्रम और आउटपुट Cω में एक रिलेशनल डेटाबेस को क्वेरी करने के लिए SQL- आधारित ऑपरेटरों का उपयोग करने की कुछ क्षमताओं को दर्शाता है। इस उदाहरण में प्रयुक्त डेटाबेस नमूना नॉर्थविंड डेटाबेस है जो Microsoft SQL सर्वर के साथ आता है। उदाहरण में उपयोग किया गया डीबी नाम नॉर्थविंड.डील असेंबली के नॉर्थविंड नाम स्थान में डेटाबेस ऑब्जेक्ट के वैश्विक उदाहरण के लिए संदर्भित करता है जिसका उपयोग sql2comega.exe द्वारा किया जाता है

तो, हाँ, बहुत शुरुआत से (या शुरुआत से पहले, आपके दृष्टिकोण के आधार पर) LINQ स्पष्ट रूप से SQL पर आधारित था, और विशेष रूप से SQL डेटाबेस में डेटा तक पहुंच की अनुमति देने के लिए इरादा था।


5
मैं असहमत हूं कि LINQ SQL प्रश्नों के लिए आविष्कार किया गया था। LINQ में क्वेरी ऑपरेशंस पर आधारित है , जो बदले में उन्हें X which से विरासत में मिला है, जो एक पुराने हास्केल पेपर पर आधारित है। ध्यान दें कि उक्त हस्केल के लेखकों में से एक एरिक मीजर है, जो उसके बाद Xω और C and के डिज़ाइन में भी शामिल था, और निश्चित रूप से LINQ का डिज़ाइनर है। और यह शुरू से ही स्पष्ट था कि LINQ का उपयोग सभी प्रकार की चीजों को क्वेरी करने के लिए किया जा सकता है, न कि सिर्फ SQL (इसे LINQ-to-SQL, LINQ-to-XML और LINQ-to-Objects के साथ 1 दिन पहले ही भेज दिया गया है) इसके बाद ...
डब्ल्यू पर Jörg W Mittag

4
LINQ-to-Entities), और वास्तव में क्वेरी से बहुत अधिक के लिए (यह मूल रूप से सामान्य मोनाड कॉम्प्रिहेंशन सिंटैक्स है)। यह के लिए डिजाइन किया गया था अपनेपन एसक्यूएल (और XQuery) प्रोग्रामर के लिए है, लेकिन निश्चित रूप से है कि करने के लिए सीमित नहीं है। इसी तरह की नस में, स्काला के मोनाड कॉम्प्रिहेंशन forलूप्स की तरह दिखते हैं , और हास्केल का लुक सी-स्टाइल इंपॉर्टेंट कोड ब्लॉक की तरह, और इसलिए स्काला अपने मोनैडिक ऑपरेशन को कॉल करती है flatMap, और हास्केल इसे returnउसी कारण कहते हैं: "भ्रम" को रोकने के लिए फिट होने के लिए। (पूर्व) अनिवार्य प्रोग्रामर।
जोर्ग डब्ल्यू मित्तग

2
@ JörgWMittag: संपादित उत्तर देखें। मेरा मानना ​​है कि Microsoft के दस्तावेज मेरे बयानों का समर्थन करते हैं।
जेरी कॉफिन

3
+1 दरअसल, इच्छा-धोनी के अनुमान के बजाय जवाब को सही ठहराने के लिए। आप स्वयं Microsoft से अधिक आधिकारिक स्रोत प्राप्त नहीं कर सकते।
सहस्राब्दी

धन्यवाद, ठीक है सर! यह ठीक उसी तरह का उत्तर है, जिसकी मुझे आशा थी।
Tx3

8

LINQ तरीके .Net में

source.Where(x => condition)
      .Select(x => projection)

LINQ क्वेरी सिंटैक्स के साथ C # (और VB.NET) के अनुरूप होने का नाम दिया गया

from x in source
where condition
select projection

जो SQL को जानने वाले लोगों के लिए परिचित होने के लिए डिज़ाइन किया गया था

SELECT projection
FROM source x
WHERE condition

2

मेरे लिए, सेलेक्ट और एग्रीगेट अधिक मायने रखता है। जैसे ही .net में डेटा को क्वेरी और मैनिपुलेट करने के लिए इकाई प्रमुख हो जाती है, Linq का उपयोग उन डेवलपर्स द्वारा अधिक से अधिक किया जा रहा है जो संभवतः SQL के माध्यम से डेटा के साथ काम करने के लिए उपयोग किए जाते हैं। इसलिए, "चयन करें" जैसे शब्दों का उपयोग करना उन डेवलपर्स के लिए अधिक समझ में आता है, क्योंकि वे कीवर्ड हैं जो उनके लिए उपयोग किए जाते हैं।


4
"डेवलपर्स द्वारा अधिक से अधिक जो संभवतः एसक्यूएल के माध्यम से डेटा के साथ काम करने के लिए उपयोग किए जाते हैं" मुझे इस पर संदेह है। जिस व्यक्ति के साथ मैं काम करता हूं, वह एंटिटी फ्रेमवर्क का गुणगान करता है, यह पता नहीं लगा सका कि उसे INNER JOINएक दिन ऐसा करने की जरूरत थी, जब एंटिटी फ्रेमवर्क एक विकल्प नहीं था। शायद बिलकुल विपरीत। अधिक से अधिक लोग LINQ का उपयोग रोज करते हैं जो सक्रिय रूप से SQL लिखने से बचते हैं । जो लोग एसक्यूएल में सहज हैं वे शायद एसक्यूएल में अधिक करते हैं।
jpmc26

1
ऐसा मैंने नहीं देखा। मुख्य रूप से जो मुझे मिल रहा है (मेरी हालिया नौकरी की खोज के माध्यम से) वह यह है कि डेवलपर्स जो एक बार संग्रहीत प्रक्रियाओं का उपयोग करके डेटा के साथ काम करते थे, वे नियंत्रक में अपनी सभी स्क्रिप्टिंग करना शुरू कर रहे हैं। मेरे लिए, यह मदद करता है कि लिनक परिचित अभिव्यक्तियों का उपयोग करता है। मुझे संदेह नहीं है कि "आप जिस आदमी के साथ काम करते हैं," उसके लिए यह मामला है, लेकिन यह मेरा अनुभव नहीं है।
क्रिस्टीन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.