
Μπορεί ένας LINQ να ενεργοποιήσετε την εφαρμογή τρέχει σε ένα μηχάνημα που μόλις έχει εγκατασταθεί το χρόνο εκτέλεσης .NET 2.0;


Θεωρητικά, LINQ δεν είναι τίποτα περισσότερο από συντακτική ζάχαρη, και η προκύπτουσα κώδικα IL θα πρέπει να εξετάσει το ίδιο όπως θα έχετε στο .NET 2.0.


Πώς μπορώ να γράψω LINQ χωρίς τη χρήση των βιβλιοθηκών .NET 3.5; Θα τρέξει σε .NET 2.0;

 
LINQ στο Runtime NET 2,0
========================



Υπάρχουν κάποιες «αμυχές» που περιλαμβάνουν τη χρήση ενός System.Core.dll από το Framework 3.5 για να τρέξει με .net 2.0, αλλά προσωπικά δεν θα ήθελα να χρησιμοποιήσετε ένα τέτοιο κάπως σαθρά θεμέλια.


Δείτε εδώ: [LINQ υποστήριξη για .NET 2.0](http://weblogs.asp.net/fmarguerie/archive/2007/09/05/linq-support-on-net-2-0.aspx)



> 
> 1. Δημιουργήστε μια νέα εφαρμογή κονσόλας
> 2. Κρατήστε μόνο συστήματος και System.Core όπως αναφέρεται συνελεύσεις
> 3. Ρύθμιση αντιγραφής Τοπική να ισχύει και για System.Core, επειδή δεν υπάρχει στο .NET 2.0
> 4. Χρησιμοποιήστε ένα ερώτημα LINQ στην Κύρια μέθοδο. Για παράδειγμα, η μία κάτω.
> 5. Χτίζω
> 6. Αντιγράψτε το σύνολο της παραγωγής κάδο σε μια μηχανή όπου μόνο είναι εγκατεστημένο το .NET 2.0
> 7. Τρέξιμο
> 
> 
> 


(Απαιτεί .net 2.0 SP1 και δεν έχω ιδέα αν ομαδοποίηση του System.Core.dll παραβιάζει την EULA)

 

Όχι, γιατί ενώ νόμιζες LINQ είναι πραγματικά ακριβώς συντακτική ζάχαρη, στην πραγματικότητα σε μεγάλο βαθμό χρησιμοποιείται δέντρα έκφραση - ένα χαρακτηριστικό που απουσιάζει στο .NET 2.0.


Τούτου λεχθέντος .NET 3.5 βασίζεται μόνο πάνω στην κορυφή του .NET 2.0, και αυτός είναι ο λόγος για τον οποίο η IL δεν φαίνεται «διαφορετικό» ή «ειδικών».


Δεν βλέπω το λόγο για τον οποίο δεν πρέπει απλώς να εγκαταστήσετε το .NET Framework 3.5. Όλα .NET 2.0 θα δουλεύουν μια χαρά σε αυτό, υπόσχονται :)

 

Θεωρητικά ναι, αρκεί να διανείμει τα συγκεκριμένα συγκροτήματα LINQ και εξαρτήσεις. Ωστόσο, αυτό αποτελεί παραβίαση της αδειοδότησης της Microsoft. Scott Hanselman έγραψε ένα blog post σχετικά [Ανάπτυξη του ASP.NET MVC σε ASP.NET 2.0](http://www.hanselman.com/blog/DeployingASPNETMVCOnASPNET20.aspx) το οποίο είναι παρόμοιο με αυτό που θέλουν να κάνουν.

 

Απ 'όσο ξέρω η βιβλιοθήκη LINQ είναι διαθέσιμη μόνο από το πλαίσιο 3.0. Αν θέλετε να χρησιμοποιήσετε κάτι παρόμοιο στο πλαίσιο 2.0, θα πρέπει να την ξαναγράψουμε τον εαυτό σας :) ή να βρείτε ένα παρόμοιο βιβλιοθήκη τρίτου μέρους. Βρήκα μόνο ένα κομμάτι των πληροφοριών [εδώ](http://weblogs.asp.net/fmarguerie/archive/2007/09/05/linq-support-on-net-2-0.aspx) , αλλά δεν με έπεισε ούτε.

 

Δεν είμαι σίγουρος για C #.


Ξέρω, όμως, ότι μπορείτε να γράψετε κώδικα VB LINNQ w / out τα 3,5 βιβλιοθήκες, αρκεί να χρησιμοποιήσετε το πρόγραμμα μεταγλώττισης VS 2008 με στόχο το πλαίσιο 2.0.


Μπορείτε, ωστόσο, να εφαρμόσει κάποιες από τις μεθόδους LINQ τον εαυτό σας.


LINQ χρησιμοποιεί ένα syntatic μετασχηματισμού να μεταφράσει τα ερωτήματα σε εκτελέσιμο κώδικα. Βασικά, θα χρειαστεί κώδικα όπως αυτό:



```
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 μέθοδοι επέκταση λάβει εκφράσεις δέντρα ως επιχειρήματα, όχι λάμδα. Θα μοιάζει με αυτό:



```
 <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, τότε τα πράγματα θα είναι λίγο πιο δύσκολο.

 

Είναι περίεργο ότι κανείς δεν έχει αναφερθεί [LINQBridge](http://www.albahari.com/nutshell/linqbridge.aspx) . Αυτό το μικρό φοβερό έργο είναι μια backport της LINQ (IEnumerable, αλλά χωρίς IQueryable) και της εξάρτησής της (Func, Δράση, κλπ) σε .NET 2.0. Και:



> 
> Αν το έργο σας παραπέμπει σε LINQBridge κατά τη σύνταξη, τότε θα συνδεθεί με φορείς ερώτημα LINQBridge του? αν παραπέμπει System.Core κατά τη σύνταξη, τότε θα συνδεθεί με φορείς ερώτημα Framework 3.5 του.
> 
> 
> 

 

Σύντομη απάντηση:


* **LINQ σε αντικείμενα: ναι** ( `IEnumerable<T>`)
* **LINQ σε SQL / οντότητες: όχι** ( `IQueryable<T>`)
* LINQ σε XML / DataSets: δεν έχει ακόμη;




---


Δείτε [ερώτημα αυτό](https://stackoverflow.com/questions/173080/c-net-3-0-3-5-features-in-2-0-using-visual-studio-2008) για το .Net 3.5 χαρακτηριστικά που είναι διαθέσιμα αυτόματα ή με λίγη προσπάθεια, όταν στοχοθέτηση .Net 2.0 από VS2008.


Βασικά, τίποτα που είναι μόνο «ζάχαρη σύνταξη» και οι νέες μεταγλωττιστές (C # 3.0, VB 9,0) εκπέμπουν ως 2,0-συμβατό IL θα λειτουργήσει. Αυτό περιλαμβάνει πολλά χαρακτηριστικά που χρησιμοποιούνται από LINQ, όπως ανώνυμες κατηγορίες, λάμδα ως ανώνυμη συνέδρους, αυτόματη ιδιότητες, αρχικοποιήσεις αντικείμενο, και αρχικοποιήσεις συλλογή.


Ορισμένες λειτουργίες LINQ να χρησιμοποιήσετε τις κατηγορίες, τις διασυνδέσεις, οι αντιπρόσωποι και οι μέθοδοι επέκταση που ζουν στα νέα 3.5 συνελεύσεις (όπως System.Core.dll). Ανακατανομή αυτές τις συνελεύσεις αποτελεί παραβίαση της άδειας, αλλά θα μπορούσαν να επαναυλοποιηθεί. Χρησιμοποιώντας μεθόδους επέκτασης μόνο που χρειάζεται είναι να δηλώσετε ένα κενό `System.Runtime.CompilerServices.ExtensionAttribute`. LINQ σε αντικείμενα στηρίζεται σε `IEnumerable<T>`επεκτάσεις και αρκετές δηλώσεις εκπροσώπου (οι `Action<T>`και `Func<T>`οικογένειες) και έχουν εφαρμοστεί σε [LINQBridge](http://www.albahari.com/nutshell/linqbridge.aspx) (όπως [mausch](https://stackoverflow.com/questions/2138/linq-on-the-net-2-0-runtime/394595#394595) αναφέρεται). LINQ σε XML και LINQ να DataSets βασίζονται σε LINQ σε αντικείμενα που υποθέτω ότι θα μπορούσε επίσης να εφαρμοστεί για .Net 2.0, αλλά δεν έχω δει αυτό κάνει ακόμα.


LINQ σε SQL και LINQ σε οντότητες απαιτούν πολλές νέες κατηγορίες ( `DataContext`/ `ObjectContext`, πολλά χαρακτηριστικά, `EntitySet<T>`, `EntityRef<T>`, `Link<T>`, `IQueryable<T>`, κλπ) και η έκφραση δέντρα, τα οποία, ακόμη και αν με κάποιο τρόπο επαναυλοποιηθεί, θα απαιτήσει πιθανότατα τουλάχιστον .Net 2.0 SP1 για να εργαστούν.

 

Μπορείτε να χρησιμοποιήσετε τις πηγές LINQ από μονο (ΝΕΤ για Linux) για να πάρετε LINQ που λειτουργούν με .NET 2.0.



```
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 για .NET 2.0](http://linq4you.codeplex.com/)

 

Μπορείτε να χρησιμοποιήσετε [linqbridge](https://code.google.com/p/linqbridge/) για .net 2.0

 