LINQ का सबसे कठिन या सबसे गलत पहलू क्या है? [बन्द है]


282

पृष्ठभूमि: अगले महीने में, मैं कम से कम LINQके संदर्भ में तीन वार्ताएँ करूंगा C#। मैं यह जानना चाहता हूं कि कौन से विषय उचित ध्यान देने योग्य हैं, इस आधार पर कि लोगों को समझने में मुश्किल हो सकती है, या उन्हें क्या गलत प्रभाव पड़ सकता है। मैं विशेष रूप LINQसे SQLया एंटिटी फ्रेमवर्क के बारे में बात नहीं करूंगा, उदाहरणों के अलावा कि अभिव्यक्ति के पेड़ (और आमतौर पर IQueryable) का उपयोग करके कैसे दूर से प्रश्नों को निष्पादित किया जा सकता है ।

तो, आपने क्या मुश्किल पाया है LINQ? आपने गलतफहमी के संदर्भ में क्या देखा है? उदाहरण निम्नलिखित में से कोई भी हो सकते हैं, लेकिन कृपया अपने आप को सीमित न करें!

  • C#कंपाइलर क्वेरी एक्सप्रेशन को कैसे मानता है
  • लम्बोदर भाव
  • अभिव्यक्ति के पेड़
  • एक्सटेंशन के तरीके
  • अनाम प्रकार
  • IQueryable
  • तत्काल निष्पादन को स्थगित कर दिया गया
  • स्ट्रीमिंग बनाम बफ़र्ड निष्पादन (उदा। ऑर्डरबाई स्थगित हो गई है लेकिन बफ़र्ड है)
  • अवैध रूप से टाइप किए गए स्थानीय चर
  • जटिल सामान्य हस्ताक्षर पढ़ना (जैसे Enumerable.Join )

3
मुझे यह जानने में दिलचस्पी होगी कि आप इन वार्ताओं को कब करने जा रहे हैं, और यदि उन्हें ऑनलाइन देखने का कोई तरीका है
Mark Heath

2
पहली बात: कोपेनहेगन, 30 अक्टूबर। उम्मीद है कि यह टेप किया जाएगा। (पूरा दिन!) दूसरी बात: लंदन, 19 नवंबर शाम, लंदन .NET यूजर्स ग्रुप, शायद पुश लाइनक्यू पर। तीसरी बात: रीडिंग, 22 नवंबर, डेवलपर डेवलपर डे, 60 मिनट में LINQ को ऑब्जेक्ट में लागू करना।
जॉन स्कीट

1
डाउनवोटर्स: कृपया एक व्याख्यात्मक टिप्पणी जोड़ें।
जॉन स्कीट

2
@ जॉन, क्षमा करें, लेकिन मुझे इसे बंद करने की आवश्यकता है।
टिम पोस्ट

3
@ समय: पर्याप्त निष्पक्ष - यह वैसे भी कोई और जवाब नहीं मिल रहा था। व्यक्तिगत रूप से मुझे लगता है कि यह रचनात्मक होने के साथ-साथ खत्म हो गया था , आप - मैं निश्चित रूप से यह देखने के लिए उपयोगी था कि लोग क्या मुश्किल पाते हैं। मैं शायद यह अब नहीं पूछा होता ...
जॉन स्कीट

जवाबों:


271

विलंबित निष्पादन


12
राइटो - यह स्पष्ट रूप से पाठकों के बीच पसंदीदा है, जो इस प्रश्न के लिए सबसे महत्वपूर्ण बात है। मैं "बफ़रिंग बनाम स्ट्रीमिंग" को मिक्स में शामिल करूँगा, साथ ही साथ निकटता से संबंधित है - और अक्सर इस पर चर्चा नहीं की जाती है कि मैं किताबों में जितना देखना चाहता हूं।
जॉन स्कीट

10
वास्तव में? मेरे पास यह आलसी-भारित प्रकृति थी, जो मैंने लिनक को सीखते हुए कई बार मुझे बताया, यह कभी भी मेरे लिए कोई समस्या नहीं थी।
एडम लाससेक

26
एलासेक से सहमत हैं। MSDN प्रलेखन स्पष्ट रूप से LINQ की आलसी मूल्यांकन प्रकृति बताता है। शायद असली समस्या डेवलपर्स की आलसी प्रोग्रामिंग प्रकृति है ... =)
Seiti

4
... खासकर जब आपको पता चलता है कि यह LINQ ऑब्जेक्ट्स पर लागू होता है, न कि LINQ 2 SQL पर - जब आप 10 वेब मेथड कॉल्स देखते हैं तो आइटम की एक सूची प्राप्त करने के लिए जब आप पहले से ही उसी आइटम की सूची के माध्यम से एन्यूमरेट कर रहे हों और आपने सोचा हो। सूची का पहले ही मूल्यांकन किया गया था
सिमोन_विवर

5
यह जानना कि पैदावार कथन क्या है और यह कैसे काम करता है IMQ LINQ की गहन समझ के लिए महत्वपूर्ण है।
peSHIr

125

मुझे पता है कि आस्थगित निष्पादन अवधारणा को अब तक मुझ में पीटा जाना चाहिए, लेकिन इस उदाहरण ने मुझे वास्तव में इसकी व्यावहारिक समझ प्राप्त करने में मदद की:

static void Linq_Deferred_Execution_Demo()
{
    List<String> items = new List<string> { "Bob", "Alice", "Trent" };

    var results = from s in items select s;

    Console.WriteLine("Before add:");
    foreach (var result in results)
    {
        Console.WriteLine(result);
    }

    items.Add("Mallory");

    //
    //  Enumerating the results again will return the new item, even
    //  though we did not re-assign the Linq expression to it!
    //

    Console.WriteLine("\nAfter add:");
    foreach (var result in results)
    {
        Console.WriteLine(result);
    }
}

उपरोक्त कोड निम्नलिखित देता है:

Before add:
Bob
Alice
Trent

After add:
Bob
Alice
Trent
Mallory

2
blogs.msdn.com/b/charlie/archive/2007/12/09/… <- मुझे लगता है कि यह मेरी राय में समझाने के लिए सबसे अच्छा ब्लॉग है। (2007 तक बाहर, विश्वास नहीं कर सकता कि यह पहले से ही लंबे समय से है)
Phill

104

वहाँ सिर्फ तुलना में अधिक है कि LINQकरने के लिए SQLऔर सुविधाओं सिर्फ एक से अधिक हैं SQLपार्सर भाषा में एम्बेडेड।


6
मुझे लगता है कि हर कोई बीमार है: /
TraumaPony

40
हर कोई नहीं करता है! मुझे अभी भी नहीं पता कि LINQ SQL क्या है, और मैं LINQ का उपयोग सभी लानत समय के लिए करता हूँ।
रॉबर्ट रॉसनी

2
जब मैं LINQ का उपयोग करके कुछ समझाने और समझाने पर मुझे बहुत गुस्सा आता है और दूसरा व्यक्ति बस मुझे देखता है और कहता है "ओह, मैं LINQ का उपयोग उस तरह की किसी भी चीज के लिए नहीं करता, केवल SQL" :(
नाथन डब्ल्यू

13
सहमत, कई लोगों को यह समझ में नहीं आता है कि LINQ एक सामान्य उद्देश्य उपकरण है।
मैथ्यू ओलेनिक

86

बिग ओ संकेतन । LINQ इसे बिना एहसास के O (n ^ 4) एल्गोरिदम लिखना अविश्वसनीय रूप से आसान बनाता है, अगर आपको नहीं पता कि आप क्या कर रहे हैं।


16
एक उदाहरण के बारे में कैसे?
हुग्डब्रोर्न 14

4
एक उदाहरण के रूप में, हो सकता है कि वह इस तथ्य का मतलब है कि एक सेलेक्ट क्लॉज का होना बहुत आसान है, उनमें से प्रत्येक के साथ कई सम () ऑपरेटर हैं जो पूरे रिकॉर्डसेट पर एक और पास देते हैं।
रोब पैकवुड

1
वास्तव में यह भी बड़ा ओ नोटेशन क्या है और क्यों महत्वपूर्ण है, साथ ही अक्षम परिणाम के कुछ उदाहरणों के माध्यम से जाने लायक हो सकता है। मुझे लगता है कि मूल पोस्टर क्या सुझाव दे रहा था, लेकिन मुझे लगा कि मैं इसका उल्लेख करूंगा। EDIT: बस एहसास हुआ कि यह पोस्ट 1.5 साल पुरानी थी :-)
zcrar70

7
वह O (n ^ x) नहीं होगा, वह O (xn) होगा, जो कि O (n) है।
21:39 पर मालफिस्ट

3
ज्वाइन ऑपरेटर के बिना ज्वाइन करने की कोशिश करने का परिणाम O (n ^ x) होगा: i1 से रेंज 1 में i2 से रेंज 2 में i3 से रेंज 3 में i4 से रेंज 4 में जहां i1 == i2 && i3 = - i4 नए {i1 का चयन करें, i2, i3, i4}। और मैंने वास्तव में इसे पहले लिखा हुआ देखा है। यह काम करता है, लेकिन बहुत धीरे-धीरे।
मार्कफ्लफ

55

मुझे लगता है कि एक Lambdaअभिव्यक्ति एक अभिव्यक्ति पेड़ और एक गुमनाम प्रतिनिधि दोनों को हल कर सकती है, इसलिए आप एक ही घोषणात्मक lambdaअभिव्यक्ति को IEnumerable<T>विस्तार विधियों और IQueryable<T>विस्तार विधियों दोनों को पास कर सकते हैं ।


2
माना। मैं एक अनुभवी हूं और मुझे एहसास हुआ कि यह निहित कास्टिंग हो रही थी क्योंकि मैंने अपना क्वेरी लिखना शुरू कर दिया था
TheSoftwareJedi

53

मुझे यह महसूस करने के लिए बहुत लंबा रास्ता तय किया कि कई LINQ विस्तार विधियों जैसे कि Single(), SingleOrDefault()आदि में अधिभार है जो लैम्ब्डा लेते हैं।

तुम कर सकते हो :

Single(x => x.id == id)

और यह कहने की ज़रूरत नहीं है - जो कुछ खराब ट्यूटोरियल मुझे करने की आदत में मिला है

Where(x => x.id == id).Single()

+1, बहुत अच्छा। मैं इसे याद रखूंगा।
प्रेट्ज़ेल

4
मैं इसे भी भूलता रहता हूं। यह Count()दूसरों के बीच भी सही है । क्या आपको पता है कि कोड पठनीयता के स्पष्ट बोनस के अलावा कोई प्रदर्शन अंतर है?
जस्टिन मॉर्गन

1
विश्वविद्यालय में, मेरे व्याख्याता इन अधिभार का उपयोग करने के लिए अंक निकालना चाहते थे !! मैंने उसे गलत साबित कर दिया है!
टोडावर

12
यह अजीब लग सकता है लेकिन मैं दूसरा वाक्यविन्यास पसंद करता हूं। मुझे यह अधिक पठनीय लगता है।
कोनामिमन

40

LINQ to SQL I में लोग लगातार DataContext को नहीं समझ रहे हैं, इसका उपयोग कैसे किया जा सकता है और इसका उपयोग कैसे किया जाना चाहिए। बहुत से लोग DataContext को नहीं देखते हैं कि यह क्या है, एक कार्य ऑब्जेक्ट की इकाई है, एक निरंतर वस्तु नहीं है।

मैंने बहुत बार देखा है जहां लोग प्रत्येक ऑपरेशन के लिए एक नया समय बनाने के बजाय एक DataContext / session it / etc को सिंगल करने की कोशिश कर रहे हैं।

और फिर IQueryable का मूल्यांकन किए जाने से पहले DataContext का निपटान किया जाता है, लेकिन यह DataContext की तुलना में IQueryable को न समझने वाले लोगों के साथ अधिक जटिल है।

दूसरी अवधारणा जिसे मैं देख रहा हूं, वह क्वेरी सिंटैक्स बनाम एक्सप्रेशन सिंटैक्स है। मैं उस बिंदु पर कभी भी सबसे आसान उपयोग करूंगा, जो अक्सर अभिव्यक्ति सिंटैक्स के साथ चिपका होता है। बहुत सारे लोग अभी भी महसूस नहीं करते हैं कि वे अंत में एक ही चीज का उत्पादन करेंगे, क्वेरी सब के बाद अभिव्यक्ति में संकलित है।


2
चेतावनी: कार्य की इकाई एक एकल के रूप में डेटा संदर्भ के साथ एक छोटा कार्यक्रम हो सकता है।
graffic

15
आपको एक सिंगलटन में DataContext का उपयोग नहीं करना चाहिए, यह थ्रेड सुरक्षित नहीं है।
एरोन पॉवेल

3
@ स्लैश, सभी प्रोग्राम्स को मल्टीथेड नहीं किया जाता है, इसलिए बहुत सारे "डेस्कटॉप" सॉफ़्टवेयर में एक सिंगलटन के रूप में DataContext का होना ठीक है
इयान रिंगरॉज़

2
जब मैंने SQL प्रोजेक्ट के लिए अपना पहला LINQ किया, तो मुझे इस पर (DataContext का उपयोग करते हुए) काट लिया गया। मुझे नहीं लगता कि प्रलेखन और किताबें इस स्पष्ट को पर्याप्त बनाती हैं। दरअसल, मुझे लगता है कि नाम में सुधार किया जा सकता है, लेकिन मुझे यकीन नहीं है कि कैसे।
रोजर लिप्सकॉम्ब

1
यह मेरे सिर में इस पाउंड को प्राप्त करने के लिए कई बार LinG पर स्कॉटगू के आर्टिवल्स को पढ़ना शुरू किया।
इवान प्लाइस

34

मुझे लगता है कि LINQ की गलतफहमी यह है कि यह एक भाषा एक्सटेंशन है , न कि डेटाबेस एक्सटेंशन या निर्माण।

LINQसे बहुत अधिक है LINQ to SQL

अब जब हम में से अधिकांश ने LINQसंग्रह पर उपयोग किया है, तो हम कभी भी वापस नहीं जाएंगे!

LINQ 2.0 में जेनरिक के बाद से .NET और 3.0 में बेनामी प्रकार के लिए सबसे महत्वपूर्ण विशेषता है।

और अब जब हमारे पास लैम्ब्डा है, तो मैं समानांतर प्रोग्रामिंग की प्रतीक्षा नहीं कर सकता!


मैं इसे अनाम प्रकारों की तुलना में अधिक महत्वपूर्ण भी कहूंगा, और संभवतः जेनरिकों से भी अधिक।
जस्टिन मॉर्गन

26

मैं एक के लिए यकीन है कि अगर मैं जानना चाहता हूँ कि अभिव्यक्ति पेड़ क्या हैं, और क्यों चाहिए।


6
मुझे लगता है कि यह जानने लायक है कि अभिव्यक्ति के पेड़ क्या हैं और वे क्यों मौजूद हैं, लेकिन उन्हें खुद बनाने के तरीके का विवरण नहीं। (वे एक हाथ से निर्माण करने के लिए दर्द कर रहे हैं, लेकिन संकलक जब एक लंबोदर अभिव्यक्ति परिवर्तित करने के लिए एक महान काम करेगा।)
जॉन स्कीट

3
दरअसल, मैं अभिव्यक्ति के पेड़ों पर कुछ ब्लॉग प्रविष्टियाँ करने के बारे में सोच रहा था (क्योंकि मैं उन्हें "प्राप्त" करता हूं)। मैं बहुत ही उपयोगी अभिव्यक्ति के पेड़ से छेड़छाड़ मिल ...
मार्क Gravell

हालांकि, मुझे नहीं लगता कि वे जॉन की बात (रों) ;-p के लिए उपयोगी हो
मार्क Gravell

3
मुझे बस इस बात की चिंता है कि अभिव्यक्ति के पेड़ पैदावार बयान की तरह होने जा रहे हैं: ऐसा कुछ जो इस तथ्य के बावजूद अविश्वसनीय रूप से मूल्यवान है कि मुझे समझ नहीं आया कि यह पहले क्या था।
रॉ में रॉबर्ट रोसनी

1
मार्क ग्रेवेल मैं इस विषय पर आपके ब्लॉग प्रविष्टियों को पढ़ना पसंद करूंगा। इसके लिए तत्पर हैं
अलेक्जेंड्रे ब्रिसेबोइस

20

मैं LINQ के लिए काफी नया हूँ। यहाँ मैं अपने पहले प्रयास में लड़खड़ा गया

  • कई प्रश्नों को एक में मिलाकर
  • Visual Studio में LINQ क्वेरी को प्रभावी रूप से डीबग करना।

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

3
LINQ पैड का उपयोग करने के लिए ये एक अच्छी जगह हो सकती है
Maslow

2
दिल से सहमत हूँ; इसीलिए मैंने LINQ Secrets Revealed: Chaining and Debugging लिखा , बस Simple-Talk.com पर प्रकाशित किया, ताकि आपको सहायता मिल सके।
माइकल सोरेंस

हां, LinqPad अपने LINQ प्रश्नों को विकसित करने के लिए एक महान माध्यमिक उपकरण है। विशेष रूप से शुरू करते समय और आप सम्मेलनों / पैटर्न के लिए नए हैं।
भैंस

20

कुछ ऐसा है जो मुझे मूल रूप से महसूस नहीं हुआ था कि LINQ सिंटैक्स की आवश्यकता नहीं है IEnumerable<T>या IQueryable<T>काम करने के लिए, LINQ सिर्फ पैटर्न मिलान के बारे में है।

ऑल्ट टेक्स्ट

यहाँ उत्तर है (नहीं, मैंने वह ब्लॉग नहीं लिखा था , बार्ट डी स्मेट ने किया था, और वह LINQ पर सबसे अच्छे ब्लॉगर्स में से एक है)।


1
आपको यह ब्लॉग पोस्ट रोचक भी लग सकती है: msmvps.com/blogs/jon_skeet/archive/2008/02/29/…/
जॉन स्कीट

अच्छा पोस्ट जॉन (मैं आपके ब्लॉग की सदस्यता लेता हूं, केवल हाल ही में)।
हारून पॉवेल

19

मुझे अभी भी "लेट" कमांड (जो मैंने कभी इस्तेमाल नहीं किया है) और सेलेमनी (जो मैंने इस्तेमाल किया है, के साथ परेशानी है, लेकिन मुझे यकीन नहीं है कि मैंने इसे सही किया है)


2
जब भी आप एक वैरिएबल पेश करना चाहते हैं तो आप एक स्टेटमेंट का उपयोग करेंगे। एक पारंपरिक लूप के बारे में सोचें जहां आप इसके भीतर चर पेश कर रहे हैं और प्रत्येक चर को कोड की पठनीयता में मदद करने के लिए एक नाम दे रहे हैं। कभी-कभी यह भी अच्छा होता है जहां आपके पास फ़ंक्शन परिणाम का मूल्यांकन करने वाला एक वक्तव्य होता है, जिसे आप दो बार परिणाम का मूल्यांकन किए बिना चुन सकते हैं और उस पर ऑर्डर कर सकते हैं।
रोब पैकवुड

'लेट' आपको कंपोजिट प्रकार करने की अनुमति देता है। आसान सामान।
Phill

19

समझ जब Linq प्रदाताओं के बीच अमूर्त लीक। कुछ चीजें वस्तुओं पर काम करती हैं, लेकिन एसक्यूएल नहीं (उदाहरण के लिए। टेकलेहाइल)। कुछ तरीके SQL (ToUpper) में अनुवादित हो सकते हैं जबकि अन्य नहीं कर सकते। कुछ तकनीक वस्तुओं में अधिक कुशल हैं जहां अन्य एसक्यूएल में अलग-अलग प्रभावी हैं (अलग-अलग तरीकों से जुड़ें)।


1
यह बहुत अच्छी बात है। यह मदद नहीं करता है कि Intellisense आपको उन सभी को दिखाएगा और यह आमतौर पर संकलन भी करेगा। फिर आप रनटाइम पर उड़ते हैं। मुझे उम्मीद है कि वीएस 2010 प्रासंगिक विस्तार के तरीकों को दिखाने का बेहतर काम करता है।
जेसन शॉर्ट

12

चीजों की जोड़ी।

  1. Linq को SQL के रूप में Linq के बारे में सोच रहे लोग।
  2. कुछ लोगों को लगता है कि वे इस प्रदर्शन निहितार्थ पर विचार किए बिना सभी प्रश्न / लाइनक प्रश्नों की जगह लेना शुरू कर सकते हैं।

11

ठीक है, मांग के कारण, मैंने कुछ अभिव्यक्ति सामान लिखा है। मैं 100% से खुश नहीं हूँ कि ब्लॉगर और LiveWriter ने इसे प्रारूपित करने की साजिश कैसे की है, लेकिन यह अभी के लिए करेंगे ...

वैसे भी, यहाँ जाता है ... मुझे कोई प्रतिक्रिया पसंद आएगी, खासकर अगर ऐसे क्षेत्र हैं जहाँ लोग अधिक जानकारी चाहते हैं।

यहाँ यह है , इसे पसंद है या इसे नफरत है ...


10

विशेष रूप से LINQ से SQL में कुछ त्रुटि संदेश, बहुत भ्रामक हो सकते हैं। मुसकान

मुझे हर किसी की तरह कई बार आस्थगित निष्पादन द्वारा काट दिया गया है। मुझे लगता है कि मेरे लिए सबसे भ्रमित करने वाली बात एसक्यूएल सर्वर क्वेरी प्रोवाइडर रही है और आप इसके साथ क्या कर सकते हैं और क्या नहीं।

मैं अभी भी इस तथ्य से चकित हूं कि आप दशमलव / धन कॉलम पर ऐसा योग नहीं बना सकते हैं जो कभी-कभी खाली हो। DefaultIfEmpty () का उपयोग करने से काम नहीं चलेगा। :(


1
Shold से कहां से योग काम करने के लिए कि क्वेरी पर एक तमाचा आसान prette हो
Esben Skov पेडरसन

9

मुझे लगता है कि LINQ में कवर करने के लिए एक बहुत अच्छी बात यह है कि आप अपने आप को परेशानी वाले प्रदर्शन में कैसे पा सकते हैं। उदाहरण के लिए, एक शर्त के रूप में LINQ की गिनती का उपयोग करना वास्तव में, वास्तव में स्मार्ट नहीं है।


7

कि IQueryable दोनों को स्वीकार करते हैं, Expression<Func<T1, T2, T3, ...>>और Func<T1, T2, T3, ...>, 2 मामले में प्रदर्शन में गिरावट के बारे में संकेत दिए बिना।

यहाँ कोड उदाहरण है, जो यह दर्शाता है कि मेरा क्या मतलब है:

[TestMethod]
public void QueryComplexityTest()
{
    var users = _dataContext.Users;

    Func<User, bool>                funcSelector =       q => q.UserName.StartsWith("Test");
    Expression<Func<User, bool>>    expressionSelector = q => q.UserName.StartsWith("Test");

    // Returns IEnumerable, and do filtering of data on client-side
    IQueryable<User> func = users.Where(funcSelector).AsQueryable();
    // Returns IQuerible and do filtering of data on server side
    // SELECT ... FROM [dbo].[User] AS [t0] WHERE [t0].[user_name] LIKE @p0
    IQueryable<User> exp = users.Where(expressionSelector);
}

क्या तुम समझा सकते हो? मैं पीछा नहीं कर रहा हूँ ...
Pretzel

@Pretzel मैंने कोड उदाहरण जोड़ा है, जो मेरे मुद्दे को प्रदर्शित करता है।
वलेरा कोलूपेव

कोड उदाहरण के लिए धन्यवाद! बहुत मददगार।
भैंस

6

मुझे नहीं पता कि यह गलत समझा जाता है - लेकिन मेरे लिए, बस अज्ञात।

मुझे DataLoadOptions के बारे में जानकर प्रसन्नता हुई और मैं यह कैसे नियंत्रित कर सकता हूं कि किसी विशेष क्वेरी को बनाते समय कौन-सी तालिकाएँ सम्मिलित हों।

अधिक जानकारी के लिए यहाँ देखें: MSDN: DataLoadOptions


6

मैं कहूंगा कि सबसे गलत समझा (या कि गैर-समझा जाना चाहिए?) LINQ का पहलू IQueryable और कस्टम LINQ प्रदाता है

मैं अब कुछ समय के लिए LINQ का उपयोग कर रहा हूँ और IEnumerable दुनिया में पूरी तरह से आरामदायक हूँ, और LINQ के साथ अधिकांश समस्याओं को हल कर सकता हूँ।

लेकिन जब मैंने IQueryable, और एक्सप्रेशंस और कस्टम लाइनक प्रदाताओं के बारे में देखना और पढ़ना शुरू किया, तो इसने मेरा सिर स्पिन कर दिया। यदि आप कुछ बहुत ही जटिल तर्क देखना चाहते हैं तो LINQ to SQL कैसे काम करता है, इस पर एक नज़र डालें।

मैं LINQ के उस पहलू को समझने के लिए उत्सुक हूं ...


6

जैसा कि ज्यादातर लोगों ने कहा, मुझे लगता है कि सबसे गलत समझा गया हिस्सा यह मान रहा है कि LINQ टी-एसक्यूएल का सिर्फ एक प्रतिस्थापन है। मेरे प्रबंधक जो खुद को TSQL गुरु के रूप में मानते हैं, हमें अपनी परियोजना में LINQ का उपयोग नहीं करने देंगे और यहां तक ​​कि इस तरह की चीज को जारी करने के लिए एमएस से भी नफरत करते हैं !!!


बहुत से लोग इसे TSQL के प्रतिस्थापन के रूप में उपयोग करते हैं। उनमें से ज्यादातर ने एक निष्पादन योजना के बारे में कभी नहीं सुना।
एरिकक्लेन

+1 क्योंकि मैं आपके प्रबंधक से सहमत हूं, कम से कम किसी भी परियोजना में LINQ को SQL की अनुमति देने के रूप में। LINQ to Objects एक और मामला पूरी तरह से है।
NotMe

5

जब कोई क्वेरी निष्पादित की जाती है तो var क्या दर्शाता है?

यह है iQueryable, iSingleResult, iMultipleResult, या क्या करता है यह कार्यान्वयन के आधार पर बदल। उपयोग करने के बारे में कुछ अटकलें हैं (जो प्रतीत होता है) डायनामिक-टाइपिंग बनाम सी # में स्थिर स्टेटिक-टाइपिंग।


AFAIK var हमेशा प्रश्न में ठोस वर्ग है (भले ही यह एक अनाम प्रकार है) इसलिए यह कभी भी IQueryable, ISingleResult या 'I' के साथ शुरू होने वाली कोई भी चीज़ नहीं है (ठोस वर्ग जो 'I' के साथ शुरू होते हैं, उन्हें लागू नहीं करने की आवश्यकता है)।
मोति

5

एक पाश को घोंसला बनाना कितना आसान है, ऐसा कुछ है जो मुझे नहीं लगता कि हर कोई समझता है।

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

from outerloopitem in outerloopitems
from innerloopitem in outerloopitem.childitems
select outerloopitem, innerloopitem

+1, वाह। यह बहुत शक्तिशाली है।
प्रेट्ज़ेल

4

group by अभी भी मेरा सिर घूमता है।

आस्थगित निष्पादन के बारे में किसी भी भ्रम को कुछ सरल LINQ- आधारित कोड के माध्यम से कदम और घड़ी की खिड़की में चारों ओर खेलने से हल किया जा सकता है।


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

4

संकलित प्रश्न

तथ्य यह है कि आप चेन नहीं कर सकते IQueryableक्योंकि वे विधि कॉल हैं (जबकि अभी भी और कुछ नहीं बल्कि एसक्यूएल ट्रांसएसेलेबल!) और यह कि इसके चारों ओर काम करना लगभग असंभव है यह मनमौजी है और DRY का एक बहुत बड़ा उल्लंघन बनाता है। मुझे IQueryableऐड-हॉक के लिए मेरे प्रश्नों की आवश्यकता नहीं है, जिसमें मेरे पास संकलित प्रश्न नहीं हैं (मैंने केवल भारी परिदृश्यों के लिए प्रश्न संकलित किए हैं), लेकिन संकलित प्रश्नों में मैं उनका उपयोग नहीं कर सकता और इसके बजाय फिर से नियमित क्वेरी सिंटैक्स लिखने की आवश्यकता है। अब मैं 2 जगहों पर एक ही सबक्वेरी कर रहा हूं, अगर कुछ बदलता है, और आगे भी दोनों को अपडेट करने के लिए याद रखना चाहिए। एक डरावना सपना।


4

मुझे लगता है कि LINQ to SQL के बारे में # 1 गलत धारणा यह है कि आप इसका प्रभावी उपयोग करने के लिए SQL को अभी भी जानते हैं।

Linq से Sql के बारे में एक और गलत बात यह है कि आपको इसे काम करने के लिए अपने डेटाबेस की सुरक्षा को गैरबराबरी के बिंदु तक कम करना होगा।

एक तीसरा बिंदु यह है कि Linq को Sql के साथ-साथ डायनामिक क्लासेस (जिसका अर्थ रनिंग के समय क्लास डेफिनेशन बनाया जाता है) के साथ-साथ समय-समय पर संकलन की एक जबरदस्त मात्रा का उपयोग करता है। जो परफॉर्मेंस को बिल्कुल मार सकता है।


4
हालाँकि SQL को पहले से ही जानना बहुत फायदेमंद है। कुछ SQL जो कि Linq से SQL (और अन्य ORM) द्वारा उत्सर्जित होता है, सर्वथा संदिग्ध हो सकता है, और SQL को जानने से ऐसी समस्याओं का निदान करने में मदद मिलती है। इसके अलावा, SQL को Linq संग्रहीत प्रक्रियाओं का उपयोग कर सकता है।
रॉबर्ट हार्वे


2

जैसा कि उल्लेख किया गया है, आलसी लोडिंग और आस्थगित निष्पादन

LINQ से वस्तुएँ और LINQ से XML (IEnumerable) LINQ से SQL (IQueryable) से भिन्न कैसे हैं

सभी परतों में LINQ के साथ डेटा एक्सेस लेयर, बिजनेस लेयर और प्रेजेंटेशन लेयर बनाने के लिए HOW .... और एक अच्छा उदाहरण है।


पहले दो मैं कर सकता हूं। मैं "अभी तक यह करने का सही तरीका है" समझ में तीसरा करने की कोशिश नहीं करना चाहता ...
जॉन स्कीट

+1, जब तक आपने इसे इंगित नहीं किया, तब तक मुझे महसूस नहीं हुआ कि LINQ-to-Objects और LINQ-to-XML आईएनक्यूएबल के रूप में LINQ-to-SQL के विपरीत IEnumerable थे, लेकिन यह समझ में आता है। धन्यवाद!
प्रेट्ज़ेल

2

जैसा कि ज्यादातर लोगों ने कहा, मुझे लगता है कि सबसे गलत समझा गया हिस्सा यह मान रहा है कि LINQ टी-एसक्यूएल का सिर्फ एक प्रतिस्थापन है। मेरे प्रबंधक जो खुद को टीएसक्यूएल गुरु मानते हैं, वे हमें अपनी परियोजना में LINQ का उपयोग नहीं करने देंगे और यहां तक ​​कि इस तरह की चीज को जारी करने के लिए एमएस से भी नफरत करते हैं !!!


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