Question

Une application compatible LINQ peut-elle s'exécuter sur une machine sur laquelle seul le runtime .NET 2.0 est installé ?

En théorie, LINQ n'est rien de plus qu'un sucre syntaxique, et le code IL résultant devrait ressembler à celui qu'il aurait dans .NET 2.0.

Comment puis-je écrire LINQ sans utiliser les bibliothèques .NET 3.5 ?Fonctionnera-t-il sur .NET 2.0 ?

Était-ce utile?

La solution

Il existe certains "Hacks" qui impliquent l'utilisation d'un System.Core.dll du Framework 3.5 pour le faire fonctionner avec .net 2.0, mais personnellement, je ne voudrais pas utiliser une base aussi fragile.

Vois ici: Prise en charge de LINQ sur .NET 2.0

  1. Créer une nouvelle application console
  2. Conservez uniquement System et System.Core comme assemblys référencés
  3. Définissez Copy Local sur true pour System.Core, car il n'existe pas dans .NET 2.0
  4. Utilisez une requête LINQ dans la méthode Main.Par exemple celui ci-dessous.
  5. Construire
  6. Copiez toute la sortie bin sur une machine sur laquelle seul .NET 2.0 est installé
  7. Courir

(Nécessite .net 2.0 SP1 et je ne sais pas si le regroupement de System.Core.dll viole le CLUF)

Autres conseils

C'est bizarre que personne n'en ait parlé Pont LINQ.Ce petit projet génial est un rétroportage de LINQ (IEnumerable, mais sans IQueryable) et de ses dépendances (Func, Action, etc.) vers .NET 2.0.Et:

Si votre projet fait référence à Linqbridge pendant la compilation, il se liera aux opérateurs de requête de Linqbridge;S'il fait référence à System.Core pendant la compilation, il se liera aux opérateurs de requête de Framework 3.5.

En théorie oui, à condition de distribuer les assemblys spécifiques à LINQ et les éventuelles dépendances.Cependant, cela constitue une violation de la licence Microsoft.Scott Hanselman a écrit un article de blog sur Déploiement d'ASP.NET MVC sur ASP.NET 2.0 ce qui ressemble à ce que vous souhaitez faire.

Vous pouvez utiliser les sources LINQ de mono (.NET pour Linux) pour faire fonctionner LINQ sur .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

Quelqu'un l'a fait ici :
LINQ pour .NET 2.0

Réponse courte:

  • LINQ aux objets :Oui (IEnumerable<T>)
  • LINQ to SQL/Entités :Non (IQueryable<T>)
  • LINQ vers XML/DataSets :pas encore?

Voir cette question à propos des fonctionnalités .Net 3.5 disponibles automatiquement ou avec peu d'effort lors du ciblage de .Net 2.0 à partir de VS2008.

Fondamentalement, tout ce qui n'est que du "sucre de syntaxe" et les nouveaux compilateurs (C# 3.0, VB 9.0) émettent comme IL compatible 2.0 fonctionneront.Cela inclut de nombreuses fonctionnalités utilisées par LINQ telles que les classes anonymes, les lambdas en tant que délégués anonymes, les propriétés automatiques, les initialiseurs d'objets et les initialiseurs de collection.

Certaines fonctionnalités de LINQ utilisent des classes, des interfaces, des délégués et des méthodes d'extension qui résident dans les nouveaux assemblys 3.5 (tels que System.Core.dll).La redistribution de ces assemblys constitue une violation de licence, mais ils pourraient être réimplémentés.Pour utiliser les méthodes d'extension, il suffit de déclarer un champ vide System.Runtime.CompilerServices.ExtensionAttribute.LINQ to Objects s'appuie sur IEnumerable<T> extensions et plusieurs déclarations de délégués (les Action<T> et Func<T> familles) et ont été mises en œuvre dans Pont LINQ (comme mausch mentionné).LINQ to XML et LINQ to DataSets s'appuient sur LINQ to Objects qui, je suppose, pourrait également être implémenté pour .Net 2.0, mais je n'ai pas encore vu cela se faire.

LINQ to SQL et LINQ to Entities nécessitent de nombreuses nouvelles classes (DataContext/ObjectContext, beaucoup d'attributs, EntitySet<T>, EntityRef<T>, Link<T>, IQueryable<T>, etc.) et les arbres d'expression, qui, même s'ils sont réimplémentés d'une manière ou d'une autre, nécessiteront probablement au moins .Net 2.0 SP1 pour fonctionner.

Je ne suis pas sûr de C#.

Je sais cependant que vous pouvez écrire du code VB LINNQ sans les bibliothèques 3.5 tant que vous utilisez le compilateur VS 2008 pour cibler le framework 2.0.

Vous devrez cependant implémenter vous-même certaines méthodes LINQ.

LINQ utilise une transformation syntaxique pour traduire les requêtes en code exécutable.En gros, cela prendra du code comme celui-ci :

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

et convertissez-le en code comme ceci :

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

Pour la fonctionnalité LINQ fournie avec le framework 3.5, ces méthodes sont implémentées en tant que méthodes d'extension sur IEnumerable ou IQueryable (il existe également de nombreuses méthodes qui fonctionnent également sur des ensembles de données).

Les méthodes d'extension IEnumerable par défaut sont définies dans System.Linq.Enumerable et ressemblent à ceci :

<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

Les méthodes d'extension IQueryable prennent les arbres d'expressions comme arguments, plutôt que comme lambdas.Ils ressemblent à ceci :

 <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

Les versions d'arborescence d'expressions vous permettent d'obtenir une représentation arborescente des expressions fournies aux clauses qui peuvent ensuite être utilisées pour générer du code SQL (ou tout ce que vous voulez).

Vous pourriez probablement créer votre propre version de LINQ to Objects en un jour environ.Tout est assez simple.

Si vous souhaitez utiliser DLINQ, les choses seraient un peu plus difficiles.

Non, car même si vous pensiez que LINQ n'était en réalité qu'un sucre syntaxique, il utilisait en réalité beaucoup d'arbres d'expression - une fonctionnalité absente de .NET 2.0.

Cela étant dit, .NET 3.5 ne s'appuie que sur .NET 2.0, et c'est la raison pour laquelle l'IL n'a pas l'air "différent" ou "spécial".

Je ne vois pas de raison pour laquelle vous ne devriez pas simplement installer le Framework .NET 3.5.Tout .NET 2.0 fonctionnera bien dessus, promis :)

Autant que je sache, la bibliothèque LINQ n'est disponible que depuis le framework 3.0.Si vous souhaitez utiliser quelque chose de similaire dans le framework 2.0, vous devrez le réécrire vous-même :) ou trouver une bibliothèque tierce similaire.Je n'ai trouvé que quelques informations ici mais cela ne m'a pas convaincu non plus.

Vous pouvez utiliser pont linq pour .net 2.0

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top