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 क्वेरी को निष्पादित करना जो डेटा की एक छोटी राशि लौटाता है, नेटवर्क पर एक पूरे डेटाबेस को लोड करने और फिर क्लाइंट पर फ़िल्टर करने से तेज है। दोनों में आदर्श परिदृश्य और सादे-गलत परिदृश्य हैं, हालाँकि।
यहां लक्ष्य और लाभ आपको डेटा-स्रोतों की एक विस्तृत श्रृंखला को क्वेरी करने के लिए एकल, स्थिर-चेक किए गए सिंटैक्स का उपयोग करने और कोड को अधिक अभिव्यंजक बनाने के लिए अनुमति देता है (उदाहरण के लिए, समूह डेटा के लिए "पारंपरिक" कोड नहीं है, यह क्या करने की कोशिश कर रहा है के संदर्भ में बहुत स्पष्ट है - यह कोड के द्रव्यमान में खो गया है)।