2010-07-27 17 views
7

संभव डुप्लिकेट:
Learning about LINQLINQ वास्तव में क्या है?

हाय सब लोग,

मैं सिर्फ समझने के लिए वास्तव में क्या LINQ DotNet में है करना चाहते हैं? और यह कैसे काम करता है?

टीएक्स

+2

आप 'गूगल पर LINQ' के लिए पहले खोज परिणाम की कोशिश की है? –

+0

http://stackoverflow.com/questions/471502/what-is-linq –

उत्तर

3

LINQ बहुत सी बातें है, यह कई छोटे चीजों का संयोजन है।

इस उत्तर में जानकारी का एक गड़बड़ी होने जा रहा है, मैं माफी माँगता हूँ। आपकी सबसे अच्छी शर्त थोड़ा इंतजार करना है और देखें कि कोई और इसे बेहतर तरीके से सारांशित करता है, और मेरे द्वारा उपयोग किए जाने वाले कीवर्ड के लिए Google करता है।

LINQ के लिए खड़ा है "एल anguage में क्यू tegrated uery", और सबसे अनुभवहीन व्याख्या यह है कि वे सी # प्रोग्रामिंग भाषा के लिए SQL जैसी वाक्य रचना जोड़ा है।

तो बजाय:

IEnumerable<int> values = otherValues.Where(i => i > 5); 

वे वाक्य रचना है:

IEnumerable<int> values = from i in otherValues 
          where i > 5 
          select i; 

सी # संकलक वास्तव में, कोड के पहले टुकड़े के लिए ऊपर दिए गए कोड का दूसरा टुकड़ा अनुवाद करेगा वास्तव में ऐसा है, आप बस संग्रह पर विधियों को बुला रहे हैं।

हालांकि, और यहाँ पहेली का एक और हिस्सा है। उन तरीकों को वास्तव में संग्रह में परिभाषित नहीं किया जाता है। वे वे कहीं और कुछ प्रवंचना है कि मूल रूप से कहते हैं, "प्रोग्रामर इन पद्धतियों का उपयोग जैसे कि वे संग्रह प्रकार में परिभाषित किया गया के साथ शुरू करते हैं, और सिर्फ संकलन के दौरान कोड को ठीक से परिभाषित कर रहे हैं, जिसका अर्थ है, विस्तार के तरीकों के रूप में परिभाषित कर रहे हैं "।

तो उपरोक्त कोड के पहले टुकड़ा:

IEnumerable<int> values = Enumerable.Where(otherValues, i => i > 5); 

कहाँ विधि here: Enumerable.Where परिभाषित किया गया है:

IEnumerable<int> values = otherValues.Where(i => i > 5); 

वास्तव में समाप्त होता है के रूप में संकलित किया जा रहा।

जादू की अगली टुकड़ा है कि सी # संकलक Enumerable.Where, क्या यह है कि यह सिर्फ मेरा उत्तर यहाँ कोड का दूसरा टुकड़ा की तरह लग रहे करने के लिए मक्खी पर कोड का पुनर्लेखन है का उपयोग नहीं करता, और है सामान्य प्रकार की अनुमान इसे काम करते हैं। दूसरे शब्दों में, यह दिखाता है कि आपने वास्तव में कोड का दूसरा भाग लिखा था, और फिर देखें कि "अन्य वैल्यूज" List<T> है जहां Tint है, और फिर यह पता लगाएं कि Enumerable.Where कॉल करने वाला एक है।

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

इसका मतलब यह है ... कि चीजें हैं जो वास्तव में इन-स्मृति संग्रह नहीं हैं पूछे जा सकता है। उदाहरण के लिए, यदि उपरोक्त "अन्यवृत्त" कुछ ऐसा है जो डेटाबेस से डेटा प्राप्त करने के बारे में जानता है, तो अलग-अलग विधि कहां कॉल की जाएगी, न कि संख्या में। कोई भी नहीं।

यह उन अन्य कार्यान्वयनों को अपने तरीके से करने की अनुमति देता है, उदाहरण के लिए आपके लिए एसक्यूएल लिखकर, इसे निष्पादित करना, और परिणाम को पैकेजिंग करना ताकि यह कॉलिंग कोड को देख सके जैसे कि यह वास्तव में एक था के साथ शुरू करने के लिए स्मृति संग्रह।

जादू की अगली टुकड़ा भाव है। ऊपर कहाँ विधि के लिए पैरामीटर, i => i > 5 एक लैम्ब्डा अभिव्यक्ति, या एक गुमनाम विधि, ज्यादातर मामलों में है, और आप वास्तव में एक में स्मृति संग्रह के लिए इस तरह यह घोषणा कर सकते हैं:

Func<int, bool> w = delegate(int i) { return i > 5; }; 
IEnumerable<int> values = otherValues.Where(w); 

हालांकि, में अभिव्यक्ति समर्थन सी # मतलब है कि आप भी रूप में यह घोषणा कर सकते हैं:

Expression<Func<int, bool>> w = i => i > 5; 

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

यह ज्ञान उन अन्य लोगों को अनुमति देता है जहां कार्यान्वयन करने की घोषणा की जाती है, न केवल "जहां खंड" को पकड़ने के लिए, बल्कि इसे देखने के लिए, इसे अलग करें और इसे फिर से लिखें।

जिसका मतलब है कि पैदा करने कि SQL कहाँ विधि एसक्यूएल कोड के साथ सौदा करने के लिए कैसे जानता है कि में किया जा सकता।

यहाँ कहाँ विधि के LINQ एसक्यूएल को घोषणा है: Queryably.Where

+0

tx का पूरा डुप्लिकेट बहुत पूर्ण उत्तर !! –

+0

सुनिश्चित करें कि आप अपने प्रश्न के शीर्ष पर डुप्लिकेट प्रश्न लिंक देखें। –

0

SQL जैसी सिंटेक्स के उपयोग की वस्तुओं की क्वेरी के रूप में यह सोचें। यहाँ Linq IEnumerable के लिए पर विस्तार के तरीकों का एक सेट है एक उदाहरण से http://msdn.microsoft.com/en-us/vcsharp/aa336746.aspx

public void Linq1() 
{ 
    int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }; 

    var lowNums = 
     from n in numbers 
     where n < 5 
     select n; 

    Console.WriteLine("Numbers < 5:"); 
    foreach (var x in lowNums) 
    { 
     Console.WriteLine(x); 
    } 
} 
0

की नकल की है। यह आपको सामानों से संग्रह प्राप्त करने के कुछ विवरणों को दूर करने के लिए है। जब आप 'QUERY' के अपने संग्रह Linq के माध्यम से, आप इसे एक तरीका है कि कथात्मक बजाय जरूरी है में करते हैं। इसका मतलब यह है कि आपकी लिंक क्वेरी यह दिखाती है कि आप इसे प्राप्त करने के तरीके के बजाय, आप क्या प्राप्त करना चाहते हैं। एक foreach() पाश में, आप कैसे आप फ़िल्टर करना, समूह जा रहे हैं के बारे में बहुत स्पष्ट होना जरूरी है, और अपने परिणामों को सॉर्ट करने के लिए जा रहे हैं। लिंक के साथ, यह केवल कुछ छोटे बयान हैं और कार्यान्वयन विवरण आपके द्वारा दूर किए गए हैं।

लोगों का एक बहुत गलत धारणा यह Linq करने वाली Sql की वजह से एसक्यूएल के साथ क्या करना है कि है, लेकिन वास्तव में यह है कि सिर्फ एक Linq का छोटा सा हिस्सा है। लिंक की शक्ति पूरी करने के लिए आपको एल 2 एस का उपयोग करने की ज़रूरत नहीं है, और वास्तव में कई लोग नहीं करते हैं। हालांकि Linq करने वाली एसक्यूएल मेरी निजी राय में बिल्ली म्याऊ अगर आप अपने डीबी के रूप में सिर्फ एसक्यूएल सर्वर के साथ एक नेट की दुकान कर रहे है।

2

यह कई अलग अलग बातें है।

लिंक, जैसा कि यह System.Linq नामस्थान में दिखाई देता है, विस्तारस्थान विधियों का एक सेट है जो आपको सीधे कोड में संग्रह क्वेरी करने की अनुमति देता है। यह "भाषा एकीकृत क्वेरी" के लिए एक संक्षिप्त शब्द है।

यह प्रदाताओं का एक सेट भी है जो आपको विभिन्न डेटा स्रोतों से पूछताछ करने की अनुमति देता है - लिंक से एसक्यूएल के साथ एसक्यूएल, एक्सएमएल के साथ एक्सएमएल और एक्सएमएल के साथ।

2

MSDN LINQ शुरू करने का एक बहुत अच्छा काम करता है:

[...]

नेट भाषा-समन्वित क्वेरी को परिभाषित करता है सामान्य प्रयोजन मानक क्वेरी ऑपरेटरों कि ट्रेवर्सल अनुमति देते हैं का एक सेट, फिल्टर, और प्रक्षेपण के संचालन किसी भी .NET- आधारित प्रोग्रामिंग भाषा में एक सीधा अभी तक कथात्मक तरह से व्यक्त किया जा। मानक क्वेरी ऑपरेटर किसी भी IENumerable- आधारित सूचना स्रोत पर लागू होने की अनुमति देते हैं। LINQ तीसरे दलों नई डोमेन-विशिष्ट ऑपरेटरों कि लक्ष्य डोमेन या प्रौद्योगिकी के लिए उपयुक्त हैं के साथ मानक क्वेरी ऑपरेटरों के सेट बढ़ाने के लिए अनुमति देता है।इससे भी महत्वपूर्ण बात, तीसरे दलों को भी अपने खुद कार्यान्वयन कि इस तरह के दूरदराज के मूल्यांकन, क्वेरी अनुवाद, अनुकूलन, और इतने पर के रूप में अतिरिक्त सेवाएं प्रदान करते हैं साथ मानक क्वेरी ऑपरेटरों को बदलने के लिए स्वतंत्र हैं। LINQ पैटर्न के सम्मेलनों में का पालन करके, इस तरह के कार्यान्वयन समान भाषा एकीकरण और टूल मानक क्वेरी ऑपरेटरों के रूप में समर्थन का आनंद लेते हैं।

[...]

http://msdn.microsoft.com/library/bb308959.aspx

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