Vă mulțumim pentru susținere

LINQ pe .NET 2.0 Runtime

Poate o aplicație activată LINQ să ruleze pe o mașină care are instalată doar .NET 2.0 runtime?

În teorie, LINQ nu este altceva decât zahăr sintactic, iar codul IL rezultat ar trebui să arate la fel ca în cazul .NET 2.0.

Cum pot scrie LINQ fără să folosesc bibliotecile .NET 3.5? Va rula pe .NET 2.0?

0
adăugat editat

9 răspunsuri

Există unele "hack-uri" care implică utilizarea unui System.Core.dll din cadrul 3.5 pentru a face să funcționeze cu .net 2.0, dar personal nu aș vrea să folosesc o astfel de fundație oarecum șubredă.

See here: LINQ support on .NET 2.0

  1. Create a new console application
  2. Keep only System and System.Core as referenced assemblies
  3. Set Copy Local to true for System.Core, because it does not exist in .NET 2.0
  4. Use a LINQ query in the Main method. For example the one below.
  5. Build
  6. Copy all the bin output to a machine where only .NET 2.0 is installed
  7. Run

(Necesită .net 2.0 SP1 și nu am idee dacă gruparea System.Core.dll încalcă EULA)

0
adăugat
@JonasT Dacă sunteți pe .net 4.0, atunci acest lucru nu este valabil pentru tine, deoarece este vorba despre .net 2.0 folosind LINQ. Simțiți-vă liber să puneți o întrebare separată, oferind detalii despre configurația dvs.
adăugat autor Michael Stum
Licențele și brevetele încalcă bunul simț. Nu există nicio idee care să aibă originea în Microsoft. Toate acestea sunt construite pe umerii invențiilor anterioare. Totul apartine tuturor si sper ca intr-o zi va deveni evident. Schimbarea în gândire este o necesitate, altfel nu o putem face ca omenirea.
adăugat autor Mariusz
după ce am construit și a alerga, nu există nimic în dosarul bin, cu excepția dosarului de depanare. : (Am construit aplicația Console în .Net 4.0 visual studio 2010.
adăugat autor Jonas T
Mulțumesc lui Michael. Tot ceea ce caut este că fișierele de ieșire. Folosesc .net 2.0. Problema este că folosesc Visual Studio 2010, care nu produce nici o ieșire în directorul bin. Există oricum pot descărca aceste rezultate?
adăugat autor Jonas T
redistribuiți System.Core.dll este o încălcare a licenței Microsoft
adăugat autor Lucas

Nu, pentru că, în timp ce credeai că LINQ este într-adevăr zahăr sintactic, de fapt, el a folosit cu adevărat arbori de expresie - o caracteristică absentă în .NET 2.0.

Acestea fiind spuse .NET 3.5 se construieste doar pe partea de sus a .NET 2.0, si acesta este motivul pentru care IL nu arata "diferit" sau "special".

Nu văd un motiv pentru care nu trebuie doar să instalați .NET Framework 3.5. Tot ce .NET 2.0 va functiona bine pe ea, promite :)

0
adăugat
În plus, în lumea "corporativă", avem literalmente mașini care nu au fost "actualizate" la .NET 2.0 . Da. Serios, noi facem.
adăugat autor cbmeeks
Windows XP necesită SP3 pentru a instala .NET 3.0 sau o versiune superioară și anumite dispozitive care rulează Windows XP încorporate nu sunt atât de simple de actualizat.
adăugat autor Okuma.Scott
notă: copacii de expresie sunt utilizați de IQueryable (ca în LINQ to SQL), dar nu de IEnumerbale (ca în LINQ pentru obiecte)
adăugat autor Lucas
.Net 3.0 sau o versiune ulterioară nu se va instala pe Windows 2000.
adăugat autor Lamar

Din câte știu, biblioteca LINQ este disponibilă doar de la framework 3.0. Dacă doriți să utilizați ceva similar în cadrul 2.0, va trebui să rescrieți-vă singur :) sau să găsiți o bibliotecă similară de la terți. Am găsit doar informații aici , dar nici măcar nu ma convins.

0
adăugat
cadru 3.5, de fapt, nu 3.0
adăugat autor Lucas

Puteți utiliza sursele LINQ de la mono (.NET pentru Linux) pentru a obține LINQ care rulează pe .NET 2.0.

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

Someone has done it here:
LINQ for .NET 2.0

0
adăugat

Puteți utiliza linqbridge pentru .net 2.0

0
adăugat

Este ciudat că nimeni nu a menționat LINQBridge . Acest mic proiect minunat este un backport de LINQ (IEnumerable, dar fără IQueryable) și dependențele sale (Func, Action, etc) în .NET 2.0. Și:

Dacă proiectul dvs. se referă la LINQBridge   în timpul compilării, atunci se va lega   la operatorii de interogare LINQBridge; daca   referințe System.Core în timpul   compilație, atunci se va lega   Operatorii de interogare din cadrul platformei 3.5.

0
adăugat
Dacă nu suportă funcția IQueryable (nu), atunci care este motivul? ? ?
adăugat autor Stefan Steiger
Este rau ca LINQBridge nu suporta Linq-2-Xml :( Linq-2-Xml face lucrul cu Xml usor si frumos.
adăugat autor Dmitry Lobanov
Unul dintre dezavantajele lui LinqBridge este că este aproape imposibil să folosiți un cadru bun de batjocură (cum ar fi RhinoMocks sau Moq) la puterea completă atunci când utilizați LinqBrige deoarece acestea trebuie să se refere la System.Core. RhinoMocks este utilizabilă, dar cea mai bună parte este indisponibilă, deoarece nu puteți să o faceți pe System.Core și LinqBridge la un moment dat.
adăugat autor Dmitry Lobanov
Tocmai am dat peste BackLinq raboof.com/projects/backlinq de același autor! Știe cineva care este diferența sau care este ultima?
adăugat autor ala
@ală: consultați code.google.com/p/backlinq : "Sursele BackLINQ au fost a rulat și a fuzionat în proiectul LINQBridge și a fost menținut sub identitatea sa, prin urmare, acest site al proiectului a fost retras și lăsat aici în scopuri de arhivă.
adăugat autor Mauricio Scheffer
@Quandary: Func, Action și "LINQ to objects" sunt foarte utile pe cont propriu. Personal le folosesc mult mai mult decât IQueryables.
adăugat autor Mauricio Scheffer
@DmitryLobanov: problema reală este că au nevoie de acele biblioteci.
adăugat autor Mauricio Scheffer
@Dmitry Linq2Xml este modul în care primesc locuri de muncă atât de repede. Xpath este încă o alternativă bună, dar nu la fel de fluent.
adăugat autor Jeremy
+1 Folosesc acest lucru foarte mult. Notă: aceasta este o implementare a LINQ pentru obiecte (extensiile IEnumerabile), funcționează perfect dacă se utilizează VS2008 (C # 3.0) pentru cadrul de direcționare 2.0+. Nu este o implementare a LINQ la SQL sau alți furnizori LINQ.
adăugat autor Lucas

Nu sunt sigur de C #.

Știu, totuși, că puteți scrie codul VB LINNQ fără fișierele 3.5, atâta timp cât utilizați compilatorul VS 2008 pentru a viza cadrul 2.0.

Cu toate acestea, va trebui să implementați unele dintre metodele LINQ de sine.

LINQ utilizează o transformare sintatică pentru a traduce interogările în cod executabil. Practic, va fi nevoie de un cod ca acesta:

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

și convertiți-l în cod ca acesta:

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

Pentru funcționalitatea LINQ care este livrată cu framework-ul 3.5, aceste metode sunt implementate ca metode de extensie pe IEnumerable sau IQueryable (există și o grămadă de metode care funcționează și pe seturi de date).

Metodele implicite de extensie IEnumerable sunt definite în System.Linq.Enumerable și arată astfel:


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

Metodele de extensie IQueryable iau arbori ca argumente, mai degrabă decât lambda. Ele arata astfel:

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

Versiunile arborelui de expresie vă permit să obțineți o reprezentare arborescentă a expresiilor furnizate clauzelor care pot fi apoi folosite pentru a genera codul SQL (sau ce vreți altceva doriți).

S-ar putea să vă creați probabil propria versiune de LINQ la obiecte în aproximativ o zi sau cam asa ceva. Totul este destul de drept.

Dacă doriți să utilizați DLINQ, atunci lucrurile ar fi un pic mai dificil.

0
adăugat
Dar puteți să vă scrieți propria implementare a arborelui de expresie dacă doriți.
adăugat autor Scott Wisniewski
.. și da, tot ce ați spus despre VB 9.0 se aplică la C # 3.0 (folosind compilatorul nou, dar care vizează versiunea fx mai veche)
adăugat autor Lucas
+1, cu toate acestea, rețineți că arborii de expresie (pentru IQueryable) sunt disponibili numai în 3.5+
adăugat autor Lucas

În teorie da, cu condiția să distribuiți ansamblurile specifice LINQ și orice dependență. Cu toate acestea, acest lucru încalcă licențele Microsoft. Scott Hanselman a scris un post pe blog despre Implementarea MVC ASP.NET pe ASP.NET 2.0 , care este similar cu ceea ce vrei să faci.

0
adăugat

Răspuns scurt:

  • LINQ to Objects: yes (IEnumerable)
  • LINQ to SQL/Entities: no (IQueryable)
  • LINQ to XML/DataSets: not yet?

Consultați această întrebare despre caracteristicile .Net 3.5 disponibile automat sau cu puțin efort atunci când vizează .Net 2.0 de la VS2008.

Practic, orice lucru care este doar "zahăr sintaxă" și noile compilatoare (C # 3.0, VB 9.0) emit ca IL compatibil 2.0 va funcționa. Aceasta include multe funcții folosite de LINQ, cum ar fi clasele anonime, lambda-urile ca delegați anonimi, proprietățile automate, inițializatorii de obiecte și inițialele de colectare.

Some LINQ features use classes, interfaces, delegates, and extension methods that live in the new 3.5 assemblies (such as System.Core.dll). Redistributing these assemblies is a license violation, but they could be reimplemented. Using extension methods need only that you declare an empty System.Runtime.CompilerServices.ExtensionAttribute. LINQ to Objects relies on IEnumerable extensions and several delegate declarations (the Action and Func families) and have been implemented in LINQBridge (as mausch mentioned). LINQ to XML and LINQ to DataSets rely on LINQ to Objects which I guess could also be implemented for .Net 2.0, but I haven't seen this done yet.

LINQ to SQL and LINQ to Entities require many new classes (DataContext/ObjectContext, lots of attributes, EntitySet, EntityRef, Link, IQueryable, etc) and expression trees, which, even if somehow reimplemented, will probably require at least .Net 2.0 SP1 to work.

0
adăugat