“LINQ to Entities”, “LINQ to SQL” और “LINQ to Dataset” में क्या अंतर है


91

मैं LINQ के साथ काफी समय से काम कर रहा हूँ। हालाँकि, यह एक रहस्य बना हुआ है कि लिनक्यू के उल्लिखित स्वादों के बीच वास्तविक अंतर क्या हैं।

सफल उत्तर में उनके बीच एक छोटा अंतर होगा। प्रत्येक स्वाद का मुख्य लक्ष्य क्या है, लाभ क्या है, और क्या कोई प्रदर्शन प्रभाव है ...

PS मुझे पता है कि वहाँ बहुत सारे सूचना स्रोत हैं, लेकिन मैं एक "धोखा शीट" की तलाश कर रहा हूं, जो एक नौसिखिया को एक विशिष्ट लक्ष्य के लिए सिर पर निर्देश देता है।


जवाबों:


110
  • ये सभी LINQ - Language Integrated Query हैं - इसलिए ये सभी बहुत समानता साझा करते हैं। ये सभी "बोलियाँ" मूल रूप से आपको विभिन्न स्रोतों से डेटा का एक क्वेरी-शैली चयन करने की अनुमति देती हैं।

  • Linq-to-SQL एक ORM - ऑब्जेक्ट-रिलेशनल मैपर पर Microsoft का पहला प्रयास है। यह SQL Server को ही सपोर्ट करता है। यह .NET ऑब्जेक्ट्स के लिए SQL सर्वर डेटाबेस तालिकाओं को मैप करने के लिए एक मैपिंग तकनीक है।

  • LINQ करने वाली संस्थाओं एक ही विचार है, लेकिन ORM के रूप में पृष्ठभूमि में Entity फ्रेमवर्क का उपयोग कर - फिर से Microsoft से, लेकिन कई डेटाबेस का समर्थन करता है

  • Linq-to-DataSets LINQ है, लेकिन उपयोग करना "पुरानी शैली" ADO.NET 2.0 DataSets के खिलाफ है - Microsoft से ORM से पहले के समय में, आप ADO.NET के साथ सभी कर सकते थे DataSets, DataTables, और Linq वापस कर रहे थे। -to-DataSets डेटा के लिए उन डेटा स्टोर से पूछताछ करता है। तो इस स्थिति में, आप डेटाबेस बैकएंड से एक DataTable या DataSets (System.Data namespace) लौटा देंगे, और फिर LINQ सिंटैक्स का उपयोग करने वालों को क्वेरी करेंगे।


1
50k पर बधाई, अब आप आधिकारिक तौर पर StackOverflow पर बहुत अधिक समय बिता चुके हैं। ;)
एर 15-010

1
@ चेतावनी: धन्यवाद - और आप बिलकुल सही हैं! :-) क्या हर आदमी को एक लत छोड़नी चाहिए , नहीं? कृप्या?!?!?!
marc_s

1
marc_s, इस उत्तर के लिए धन्यवाद। क्या आप प्रदर्शन के बारे में कुछ बता सकते हैं। आपके जवाब से मुझे लगता है कि Linq-to-Entities सबसे उन्नत है और इस तरह शायद सबसे अधिक प्रदर्शन कर रहा है?
मार्सेल

2
@ मार्सेल: मेरी आंत से (कोई कठिन तथ्य नहीं), मैं कहूंगा: लिनेक-टू-एसक्यूएल या सबसे तेज़ (डेटाबेस और ऑब्जेक्ट मॉडल के बीच केवल एक परत) है, लिन्क-टू-दैटसेट एक दूसरे सेकंड, और लिनक-टू -Entities आखिरी है, क्योंकि एंटिटी फ्रेमवर्क में हमेशा मैपिंग की दो परतें होती हैं (इस प्रकार सबसे जटिलता)। लेकिन फिर से: बस एक आंत की भावना, वापस करने के लिए कोई संख्या नहीं है
marc_s

3
@marc_s मुझे पता है कि यह एक पुरानी पोस्ट है, लेकिन LINQ to Entities संभवतः ज्यादातर मामलों में LINQ से डेटासेट तक अधिक तेज़ होगी। LINQ to Dataset वास्तव में एक प्रकार नहीं है, यह LINQ उन ऑब्जेक्ट्स पर है जिनमें आप डेटासेट को ऑब्जेक्ट के रूप में उपयोग कर रहे हैं। चूंकि LINQ ऑब्जेक्ट्स पर कोई SQL नहीं करता है, तो आपको पहले SQL डेटा से अपना डेटासेट बनाना होगा, और LINQ ऑब्जेक्ट्स पर डेटा को डेटासेट में पुनः प्राप्त करने पर कोई क्वेरी ऑप्टिमाइज़ेशन करने में आपकी मदद नहीं कर सकता है। वह और डेटासेट भयानक प्रदर्शन वार हैं क्योंकि सभी कॉलम बॉक्स किए गए हैं और सभी प्रकार के स्थानांतरण प्रदर्शन को मारते हैं।
रॉबर्ट मैककी

38

LINQ प्रौद्योगिकियों का एक व्यापक सेट है, उदाहरण के लिए (उदाहरण के लिए) एक क्वेरी समझ सिंटैक्स के आसपास आधारित है:

var qry = from x in source.Foo
          where x.SomeProp == "abc"
          select x.Bar;

जिसे संकलक द्वारा कोड में मैप किया जाता है:

var qry = source.Foo.Where(x => x.SomeProp == "abc").Select(x => x.Bar);

और यहाँ असली जादू शुरू होता है। ध्यान दें कि हमने यह नहीं कहा है कि Fooयहाँ क्या है - और संकलक परवाह नहीं करता है! जब तक यह कुछ उपयुक्त विधि को हल कर सकता है जिसे कहा जाता है Whereकि एक लंबोदर ले सकता है, और उसी का परिणाम कुछ होता है Select विधि है जो लंबोदर को स्वीकार कर सकती है, यह खुश है।

अब विचार है कि लैम्ब्डा संकलित किया जा सकता है या तो (जो LINQ करने वाली डेटासेट शामिल प्रतिनिधि, LINQ करने वाली वस्तुओं के लिए,) एक गुमनाम विधि में, या कि एक वस्तु मॉडल में लैम्ब्डा का प्रतिनिधित्व करता है एक अभिव्यक्ति-वृक्ष (एक क्रम मॉडल )।

इन-मेमोरी डेटा (आमतौर पर IEnumerable<T>) के लिए, यह प्रतिनिधि को निष्पादित करता है - ठीक और तेज। लेकिन IQueryable<T>अभिव्यक्ति के ऑब्जेक्ट-प्रतिनिधित्व के लिए (ए LambdaExpression<...>) इसे अलग कर सकता है और इसे किसी भी "LINQ-to-Some" उदाहरण के लिए लागू कर सकता है।

डेटाबेस (LINQ-to-SQL, LINQ-to-Entities) के लिए इसका अर्थ हो सकता है कि TSQL लिखना, उदाहरण के लिए:

SELECT x.Bar
FROM [SomeTable] x
WHERE x.SomeProp = @p1

लेकिन यह (उदाहरण के लिए ADO.NET Data Services के लिए) HTTP क्वेरी लिखने का मतलब हो सकता है।

एक अच्छी तरह से लिखित TSQL क्वेरी को निष्पादित करना जो डेटा की एक छोटी राशि लौटाता है, नेटवर्क पर एक पूरे डेटाबेस को लोड करने और फिर क्लाइंट पर फ़िल्टर करने से तेज है। दोनों में आदर्श परिदृश्य और सादे-गलत परिदृश्य हैं, हालाँकि।

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


मार्क, इस अंतर्दृष्टि के लिए धन्यवाद। हालांकि, मैंने ऐसे विस्तृत इंटर्न के बारे में नहीं पूछा। -1, मुझे क्षमा करें, क्योंकि यह प्रश्न का उत्तर नहीं देता है।
मार्सेल

7
जैसा कि कोई व्यक्ति अपना LINQ प्रदाता लिख ​​रहा है, यह अब तक का सबसे अच्छा जवाब है। मैं -1 को लेकर असहमत हूं।
डैन बाऊरी

30

LINQ भाषा एकीकृत क्वेरी के लिए खड़ा है। यह आपको डेटा स्रोतों से जानकारी निकालने के लिए सी # के भीतर सीधे "SQL स्टाइल" क्वेरी भाषा का उपयोग करने की अनुमति देता है।

  • वह डेटा स्रोत एक SQL सर्वर डेटाबेस हो सकता है - यह Linq to SQL है
  • डेटा स्रोत इकाई ढांचे की वस्तुओं का डेटा संदर्भ हो सकता है - संस्थाओं को Linq
  • वह डेटा स्रोत ADO.net डेटा सेट हो सकता है - डेटासैट को लाइनक

वह डेटा स्रोत एक XML फ़ाइल भी हो सकती है - Linq to XML
या यहां तक ​​कि सादे वस्तुओं का एक संग्रह वर्ग - वस्तुओं के लिए Linq

LINQ क्वेरी तकनीक का वर्णन करता है, बाकी का नाम डेटा के स्रोत के बारे में बताता है।

थोड़ी अतिरिक्त पृष्ठभूमि के लिए:

डेटासेट ADO.net ऑब्जेक्ट हैं जहाँ डेटा को एक डेटाबेस से एक .net में लोड किया जाता है डेटासेट और लाइनक को उस डेटा को लोड करने के बाद क्वेरी करने के लिए इस्तेमाल किया जा सकता है।

साथ एसक्यूएल को Linq आपको लगता है कि डेटाबेस और Linq करने वाली एसक्यूएल करने के लिए नक्शे एसक्यूएल सर्वर डेटाबेस से डेटा लोड हो रहा का ख्याल रखता है .net वर्गों को परिभाषित

और अंत में Entity ढांचा एक ऐसी प्रणाली है जहाँ आप XML में डेटाबेस और ऑब्जेक्ट मैपिंग को परिभाषित कर सकते हैं, और फिर इस मैपिंग के माध्यम से लोड किए गए डेटा को क्वेरी करने के लिए Linq का उपयोग कर सकते हैं।


3
वास्तव में, Linq-to-SQL केवल SQL सर्वर है - न केवल "किसी भी" SQL डेटाबेस बैकएंड।
marc_s

3
@marc_s: अच्छी जगह है। धन्यवाद। हालांकि, अगर किसी की दिलचस्पी है, तो अन्य डेटाबेस के लिए sql प्रदाताओं को 3 पार्टी Linq हैं यदि आप उन्हें चाहते हैं। अन्य के लिए code2code.net/DB_Linq , या Google देखें । मैं हालांकि उनकी गुणवत्ता पर टिप्पणी नहीं कर सकता।
साइमन पी स्टीवंस

1
साइमन, विशेष रूप से एंटिटी फ्रेमवर्क के उस सहायक 2-लाइन सारांश के लिए धन्यवाद। +1
मार्सेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.