2008-08-05 25 views
52

क्या एक LINQ सक्षम ऐप उस मशीन पर चल सकता है जिसमें केवल .NET 2.0 रनटाइम स्थापित है?.NET 2.0 रनटाइम पर LINQ

सिद्धांत रूप में, LINQ वाक्य रचनात्मक चीनी से अधिक कुछ नहीं है, और परिणामी आईएल कोड उसी जैसा दिखना चाहिए जैसा कि यह .NET 2.0 में होगा।

मैं .NET 3.5 पुस्तकालयों का उपयोग किए बिना LINQ कैसे लिख सकता हूं? क्या यह .NET 2.0 पर चल जाएगा?

उत्तर

32

कुछ "हैक्स" हैं जो 3.5 फ्रेमवर्क से System.Core.dll का उपयोग करने के लिए इसे .NET 2.0 के साथ चलाने के लिए शामिल हैं, लेकिन व्यक्तिगत रूप से मैं नहीं ऐसी कुछ हद तक नींव नींव का उपयोग करना चाहते हैं।

यहाँ देखें: LINQ support on .NET 2.0

  1. एक नया कंसोल आवेदन
  2. संदर्भित विधानसभाओं System.Core के लिए सच को
  3. सेट की प्रतिलिपि स्थानीय रूप में केवल प्रणाली और System.Core रखें बनाएं, क्योंकि यह करता है .NET 2.0
  4. में मौजूद नहीं है मुख्य विधि में LINQ क्वेरी का उपयोग करें। उदाहरण के लिए नीचे एक।
  5. एक मशीन जहां केवल .NET 2.0 स्थापित किया गया है
  6. भागो

(.net आवश्यक है 2.0 SP1 के लिए सभी बिन उत्पादन को कॉपी करें और मुझे पता नहीं है, तो सिस्टम bundling बनाएँ। Core.dll EULA का उल्लंघन करता है)

+37

पुनर्वितरण System.Core.dll माइक्रोसॉफ्ट के लाइसेंस – Lucas

+0

का निर्माण और चलाने के बाद उल्लंघन है, डीबग फ़ोल्डर को छोड़कर बिन फ़ोल्डर में कुछ भी नहीं है। :(मैं .NET 4.0 विजुअल स्टूडियो 2010 में कंसोल एप्लिकेशन का निर्माण कर रहा हूं। –

+0

@ जोनासैट यदि आप .NET 4.0 पर हैं तो यह आपके लिए LINQ का उपयोग कर .NET 2.0 के बारे में बिल्कुल भी लागू नहीं होता है। अलग-अलग प्रश्न, आपके सेटअप के बारे में विवरण दे रहे हैं। –

3

नहीं, क्योंकि जब आपने सोचा था कि LINQ वास्तव में सिंटैक्टिक चीनी है, तो वास्तव में यह अभिव्यक्ति पेड़ों का भारी उपयोग होता है - एक सुविधा .NET 2.0 में अनुपस्थित है।

कहा जा रहा है कि .NET 3.5 केवल .NET 2.0 के शीर्ष पर बनाता है, और इसी कारण से आईएल "अलग" या "विशेष" नहीं दिखता है।

मुझे कोई कारण नहीं दिख रहा है कि आपको .NET 3.5 फ्रेमवर्क क्यों इंस्टॉल नहीं करना चाहिए। सबकुछ .NET 2.0 इस पर ठीक काम करेगा, वादा :)

+1

नेट 3.0 या उच्चतर के लिए linqbridge उपयोग कर सकते हैं खिड़कियों 2000 – Lamar

+1

नोट पर स्थापित नहीं होगा: अभिव्यक्ति के पेड़ हैं IQueryable (LINQ से SQL में) के रूप में उपयोग किया जाता है, लेकिन IENumerbale (जैसा कि LINQ से ऑब्जेक्ट्स में नहीं) – Lucas

+0

प्लस, "कॉर्पोरेट" दुनिया में, हमारे पास सचमुच ऐसी मशीनें हैं जिन्हें "नवीनीकरण" नहीं किया गया है। हाँ। गंभीरता से, हम करते हैं। – cbmeeks

11

सिद्धांत रूप में हाँ, बशर्ते आप LINQ विशिष्ट असेंबली और किसी भी निर्भरता को वितरित करें। हालांकि यह माइक्रोसॉफ्ट के लाइसेंसिंग का उल्लंघन कर रहा है। स्कॉट हंसेलमैन ने Deploying ASP.NET MVC on ASP.NET 2.0 के बारे में एक ब्लॉग पोस्ट लिखा जो आप जो करना चाहते हैं उसके समान है।

2

जहां तक ​​मुझे पता है कि LINQ लाइब्रेरी केवल फ्रेमवर्क 3.0 के बाद उपलब्ध है। यदि आप फ्रेमवर्क 2.0 में समान कुछ उपयोग करना चाहते हैं, तो आपको इसे स्वयं लिखना होगा :) या एक समान तृतीय-पक्ष लाइब्रेरी ढूंढना होगा। मुझे केवल थोड़ी सी जानकारी मिली here लेकिन यह मुझे भी विश्वास नहीं था।

+0

फ्रेमवर्क 3.5, वास्तव में, 3.0 – Lucas

5

मुझे सी # के बारे में निश्चित नहीं है।

मुझे पता है कि, जब तक आप 2.0 फ्रेमवर्क को लक्षित करने के लिए वीएस 2008 कंपाइलर का उपयोग करते हैं, तब तक आप 3.5 पुस्तकालयों को वीबी LINNQ कोड w/लिख सकते हैं।

हालांकि, आपको अपने स्वयं के कुछ LINQ विधियों को लागू करना होगा।

LINQ निष्पादन योग्य कोड में क्वेरी का अनुवाद करने के लिए एक सिंथेटिक परिवर्तन का उपयोग करता है।असल में, यह इस तरह कोड ले जाएगा:

dim q = from x in xs where x > 2 select x*4; 

और यह कोड में तब्दील इस तरह:

dim q = xs.where(function(x) x > 2).select(function(x) x * 4); 

LINQ कार्यक्षमता कि 3.5 ढांचे के साथ जहाजों, उन तरीकों विस्तार तरीकों पर के रूप में लागू कर रहे हैं या तो IENumerable या IQueryable (डेटा सेट पर भी काम करने वाले तरीकों का एक गुच्छा भी है)।

डिफ़ॉल्ट IEnumerable विस्तार तरीकों System.Linq.Enumerable में परिभाषित किया गया है और इस तरह दिखेगा रहे हैं:

<Extension()> 
public function Select(of T, R)(source as IEnumerable(of T), transform as Func(of T, R)) as IEnumerable(of R) 

    'do the transformation... 

end function 

IQueryable विस्तार तरीकों भाव पेड़ तर्कों के रूप में, बल्कि lambdas से ले लो। वे इस तरह दिखेगा:

<Extension()> 
public function Select(of T, R)(source as IQueryable<T>, transform as Expression(of Func(of T, R)) 
    'build a composite IQueryable that contains the expression tree for the transformation 
end function 

अभिव्यक्ति पेड़ संस्करणों खंड जो तब SQL कोड (या कभी और क्या आप चाहते हैं) उत्पन्न करने के लिए इस्तेमाल किया जा सकता करने के लिए प्रदान की अभिव्यक्ति का एक पेड़ प्रतिनिधित्व प्राप्त करने के लिए सक्षम।

आप संभवतः एक दिन या उससे भी अधिक समय में LINQ का अपना संस्करण बना सकते हैं। यह सब बहुत सीधे आगे है।

यदि आप DLINQ का उपयोग करना चाहते हैं, तो चीजें थोड़ा और कठिन हो जाएंगी।

+0

+1 नहीं, हालांकि ध्यान दें कि अभिव्यक्ति पेड़ (IQueryable के लिए) केवल 3.5+ – Lucas

+0

में उपलब्ध हैं .. और हाँ, वीबी 9.0 के बारे में आपने जो भी कहा है, वह सी # 3.0 पर लागू होता है (नए कंपाइलर का उपयोग करके, पुराने एफएक्स संस्करण को लक्षित करना) – Lucas

+0

लेकिन यदि आप चाहें तो आप अपना खुद का अभिव्यक्ति वृक्ष कार्यान्वयन लिख सकते हैं। –

75

यह अजीब बात है कि किसी ने भी LINQBridge का उल्लेख नहीं किया है। यह छोटी भयानक परियोजना LINQ (IENumerable, लेकिन IQueryable के बिना) का बैकपोर्ट है और इसकी निर्भरता (Func, action, आदि) .NET 2.0 पर है। और:

अपनी परियोजना के संदर्भ संकलन के दौरान LINQBridge है, तो यह LINQBridge की क्वेरी ऑपरेटरों को बाध्य होगा; यदि यह संदर्भ सिस्टम है। संकलन के दौरान, तो यह फ्रेमवर्क 3.5 के क्वेरी ऑपरेटर से जुड़ जाएगा।

+2

+1 मैं इसका बहुत उपयोग करता हूं। नोट: यह LINQ से ऑब्जेक्ट्स (IENumerable एक्सटेंशन) का कार्यान्वयन है, VS2008 (C# 3.0) लक्ष्यीकरण फ्रेमवर्क 2.0+ का उपयोग करते हुए पूरी तरह से काम करता है। यह LINQ से SQL या अन्य LINQ प्रदाताओं का कार्यान्वयन नहीं है। – Lucas

+1

यह बुरा है कि LINQBridge Linq-2-Xml का समर्थन नहीं करता है :(लिंक-2-एक्सएमएल एक्सएमएल के साथ आसान और अच्छा काम करता है। –

+0

@Dmitry Linq2Xml यह है कि मुझे नौकरियां इतनी जल्दी कैसे मिलती हैं। Xpath अभी भी एक अच्छा विकल्प है लेकिन धाराप्रवाह नहीं। – Jeremy

6

लघु जवाब: वस्तुओं को

  • LINQ: हाँ (IEnumerable<T>)
  • एसक्यूएल/संस्थाओं को LINQ: एक्सएमएल/डेटासेट से कोई (IQueryable<T>)
  • LINQ: नहीं अभी तक? जब VS2008 से नेट 2.0 लक्ष्यीकरण

this question के बारे में नेट 3.5 सुविधाएँ उपलब्ध देखें स्वत: या कम प्रयास के साथ।

असल में, कुछ भी जो "सिंटैक्स चीनी" है और नए कंपाइलर्स (सी # 3.0, वीबी 9.0) 2.0-संगत आईएल के रूप में उत्सर्जित करते हैं। इसमें LINQ द्वारा उपयोग की जाने वाली कई सुविधाएं शामिल हैं जैसे अज्ञात वर्ग, लैम्बडास अज्ञात प्रतिनिधि, स्वचालित गुण, ऑब्जेक्ट प्रारंभकर्ता, और संग्रह प्रारंभकर्ता।

कुछ LINQ विशेषताएं कक्षाओं, इंटरफेस, प्रतिनिधियों और एक्सटेंशन विधियों का उपयोग करती हैं जो नई 3.5 असेंबली (जैसे System.Core.dll) में रहते हैं। इन असेंबली को पुनर्वितरण एक लाइसेंस उल्लंघन है, लेकिन उन्हें फिर से कार्यान्वित किया जा सकता है।विस्तार विधियों का उपयोग करने के लिए केवल एक खाली System.Runtime.CompilerServices.ExtensionAttribute घोषित करने की आवश्यकता है। LINQ से ऑब्जेक्ट्स IEnumerable<T> एक्सटेंशन और कई प्रतिनिधि घोषणाओं (Action<T> और Func<T> परिवारों) पर निर्भर करता है और LINQBridge में लागू किया गया है (जैसा कि mausch उल्लेख किया गया है)। LINQ से XML और LINQ से डेटासेट्स LINQ से ऑब्जेक्ट्स पर भरोसा करते हैं जो मुझे लगता है कि .NET 2.0 के लिए भी लागू किया जा सकता है, लेकिन मैंने इसे अभी तक नहीं देखा है।

एसक्यूएल को LINQ और LINQ संस्थाओं के लिए जो है, भले ही किसी भी तरह reimplemented कई नए वर्गों (DataContext/ObjectContext, विशेषताओं के बहुत सारे, EntitySet<T>, EntityRef<T>, Link<T>, IQueryable<T>, आदि) और अभिव्यक्ति के पेड़, की आवश्यकता होती है, शायद कम से कम की आवश्यकता होगी काम करने के लिए .NET 2.0 SP1।

7

आप .NET 2.0 पर LINQ चलने के लिए मोनो (लिनक्स के लिए .NET) से LINQ स्रोतों का उपयोग कर सकते हैं।

IEnumerable<T> : yes 
IQueryable<T> : yes 
LINQ to XML : has been working in the trunk, but due to further additions, the trunk doesn't compile anymore 

किसी ने इसे यहाँ किया है:
LINQ for .NET 2.0