LINQ auf der .NET 2.0-Laufzeit

Translate

Kann eine LINQ-fähige App auf einem Computer ausgeführt werden, auf dem nur die .NET 2.0-Laufzeit installiert ist?

Theoretisch ist LINQ nichts anderes als syntaktischer Zucker, und der resultierende IL-Code sollte genauso aussehen wie in .NET 2.0.

Wie kann ich LINQ schreiben, ohne die .NET 3.5-Bibliotheken zu verwenden? Läuft es unter .NET 2.0?

This question and all comments follow the "Attribution Required."

Alle Antworten

Translate

Es gibt einige "Hacks", bei denen eine System.Core.dll aus dem 3.5 Framework verwendet wird, damit sie mit .net 2.0 ausgeführt werden kann, aber ich persönlich möchte keine so wackelige Grundlage verwenden.

Siehe hier:LINQ-Unterstützung unter .NET 2.0

  1. Erstellen Sie eine neue Konsolenanwendung
  2. Behalten Sie nur System und System.Core als referenzierte Assemblys bei
  3. Setzen Sie Copy Local für System.Core auf true, da es in .NET 2.0 nicht vorhanden ist
  4. Verwenden Sie eine LINQ-Abfrage in der Main-Methode. Zum Beispiel die unten stehende.
  5. Bauen
  6. Kopieren Sie die gesamte Bin-Ausgabe auf einen Computer, auf dem nur .NET 2.0 installiert ist
  7. Lauf

(Benötigt .net 2.0 SP1 und ich habe keine Ahnung, ob das Bündeln der System.Core.dll gegen die EULA verstößt.)

Quelle
Translate

Es ist komisch, dass niemand erwähnt hatLINQBridge. Dieses kleine großartige Projekt ist ein Backport von LINQ (IEnumerable, aber ohne IQueryable) und seinen Abhängigkeiten (Func, Action usw.) zu .NET 2.0. Und:

Wenn Ihr Projekt während der Kompilierung auf LINQBridge verweist, wird es an die Abfrageoperatoren von LINQBridge gebunden. Wenn es während der Kompilierung auf System.Core verweist, wird es an die Abfrageoperatoren von Framework 3.5 gebunden.

Quelle
Translate

Theoretisch ja, vorausgesetzt, Sie verteilen die LINQ-spezifischen Assemblys und alle Abhängigkeiten. Dies verstößt jedoch gegen die Lizenzierung von Microsoft. Scott Hanselman schrieb einen Blogbeitrag überBereitstellen von ASP.NET MVC unter ASP.NET 2.0Das ist ähnlich wie das, was Sie tun möchten.

Quelle
Translate

Sie können die LINQ-Quellen von Mono (.NET für Linux) verwenden, um LINQ unter .NET 2.0 zum Laufen zu bringen.

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

Jemand hat es hier getan:
LINQ für .NET 2.0

Quelle
Translate

Kurze Antwort:

  • LINQ zu Objekten: ja (IEnumerable<T>)
  • LINQ zu SQL / Entities: Nein (IQueryable<T>)
  • LINQ zu XML / DataSets: noch nicht?

Sehendiese FrageInformationen zu .Net 3.5-Funktionen, die automatisch oder mit geringem Aufwand verfügbar sind, wenn Sie auf .Net 2.0 von VS2008 abzielen.

Grundsätzlich funktioniert alles, was nur "Syntaxzucker" ist und die neuen Compiler (C # 3.0, VB 9.0) als 2.0-kompatibles IL ausgeben. Dies umfasst viele von LINQ verwendete Funktionen wie anonyme Klassen, Lambdas als anonyme Delegaten, automatische Eigenschaften, Objektinitialisierer und Sammlungsinitialisierer.

Einige LINQ-Funktionen verwenden Klassen, Schnittstellen, Delegaten und Erweiterungsmethoden, die in den neuen 3.5-Assemblys (z. B. System.Core.dll) enthalten sind. Die Neuverteilung dieser Assemblys stellt eine Lizenzverletzung dar, kann jedoch erneut implementiert werden. Bei Verwendung von Erweiterungsmethoden müssen Sie lediglich ein Leerzeichen deklarierenSystem.Runtime.CompilerServices.ExtensionAttribute. LINQ to Objects basiert aufIEnumerable<T>Erweiterungen und mehrere Delegiertenerklärungen (dieAction<T>undFunc<T>Familien) und wurden umgesetzt inLINQBridge(wiemauscherwähnt). LINQ to XML und LINQ to DataSets basieren auf LINQ to Objects, die vermutlich auch für .Net 2.0 implementiert werden könnten, aber ich habe dies noch nicht gesehen.

LINQ to SQL und LINQ to Entities erfordern viele neue Klassen (DataContext/ObjectContextviele Attribute,EntitySet<T>, EntityRef<T>, Link<T>, IQueryable<T>usw.) und Ausdrucksbäume, für deren Funktion wahrscheinlich mindestens .Net 2.0 SP1 erforderlich ist, auch wenn sie irgendwie neu implementiert werden.

Quelle
Translate

Bei C # bin ich mir nicht sicher.

Ich weiß jedoch, dass Sie VB LINNQ-Code ohne die 3.5-Bibliotheken schreiben können, solange Sie den VS 2008-Compiler verwenden, um auf das 2.0-Framework abzuzielen.

Sie müssen jedoch einige der LINQ-Methoden selbst implementieren.

LINQ verwendet eine syntatische Transformation, um Abfragen in ausführbaren Code zu übersetzen. Grundsätzlich wird Code wie folgt benötigt:

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

und konvertieren Sie es in Code wie folgt:

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

Für die LINQ-Funktionalität, die im Lieferumfang des 3.5-Frameworks enthalten ist, werden diese Methoden als Erweiterungsmethoden für IEnumerable oder IQueryable implementiert (es gibt auch eine Reihe von Methoden, die auch für Datensätze funktionieren).

Die standardmäßigen IEnumerable-Erweiterungsmethoden sind in System.Linq.Enumerable definiert und sehen folgendermaßen aus:

<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

Die IQueryable-Erweiterungsmethoden verwenden Ausdrucksbäume als Argumente und nicht als Lambdas. Sie sehen so aus:

 <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

Mit den Ausdrucksbaumversionen können Sie eine Baumdarstellung der Ausdrücke erhalten, die für die Klauseln bereitgestellt werden. Diese können dann zum Generieren von SQL-Code verwendet werden (oder was auch immer Sie möchten).

Sie könnten wahrscheinlich Ihre eigene Version von LINQ für Objekte in ungefähr einem Tag erstellen. Es ist alles ziemlich einfach.

Wenn Sie DLINQ verwenden möchten, sind die Dinge etwas schwieriger.

Quelle
Translate

Nein, denn während Sie dachten, LINQ sei eigentlich nur syntaktischer Zucker, wurden häufig Ausdrucksbäume verwendet - eine Funktion, die in .NET 2.0 nicht vorhanden ist.

Davon abgesehen baut .NET 3.5 nur auf .NET 2.0 auf, und das ist der Grund, warum die IL nicht "anders" oder "speziell" aussieht.

Ich sehe keinen Grund, warum Sie .NET 3.5 Framework nicht einfach installieren sollten. Alles .NET 2.0 wird gut funktionieren, versprochen :)

Quelle
Translate

Soweit ich weiß, ist die LINQ-Bibliothek erst seit dem Framework 3.0 verfügbar. Wenn Sie etwas Ähnliches in Framework 2.0 verwenden möchten, müssen Sie es selbst neu schreiben :) oder eine ähnliche Bibliothek eines Drittanbieters suchen. Ich habe nur ein paar Informationen gefundenHieraber es hat mich auch nicht überzeugt.

Quelle
Translate

Sie können verwendenLinqbridgefür .net 2.0

Quelle