LINQ sur le runtime .NET 2.0

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 que du sucre syntaxique, et le code IL résultant devrait ressembler à ce qu’il aurait dans .NET 2.0.

Comment puis-je écrire LINQ sans utiliser les bibliothèques .NET 3.5? Est-ce qu’il fonctionnera sur .NET 2.0?

Il y a quelques “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.

Voir ici: Support LINQ sur .NET 2.0

  1. Créer une nouvelle application console
  2. Ne conservez que System et System.Core comme assemblages 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 principale. Par exemple celui ci-dessous.
  5. Construire
  6. Copiez toute la sortie du bac 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 est en violation du CLUF)

C’est bizarre que personne n’ait mentionné LINQBridge . Ce petit projet génial est un backport de LINQ (IEnumerable, mais sans IQueryable) et ses dépendances (Func, Action, etc.) vers .NET 2.0. Et:

Si votre projet fait référence à LINQBridge lors de la compilation, il sera lié aux opérateurs de requête LINQBridge; s’il fait référence à System.Core pendant la compilation, il se connectera aux opérateurs de requête de Framework 3.5.

En théorie oui, à condition que vous dissortingbuiez les assemblées spécifiques LINQ et toutes les dépendances. Cependant, cela viole les licences de Microsoft. Scott Hanselman a écrit un article sur le déploiement de ASP.NET MVC sur ASP.NET 2.0, similaire à ce que vous voulez faire.

Vous pouvez utiliser les sources LINQ de mono (.NET pour Linux) pour que LINQ fonctionne sous .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 comstack anymore 

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

Réponse courte:

  • LINQ to Objects: oui ( IEnumerable )
  • LINQ to SQL / Entités: non ( IQueryable )
  • LINQ to XML / DataSets: pas encore?

Voir cette question sur les fonctionnalités de .Net 3.5 disponibles automatiquement ou avec peu d’efforts lorsque vous ciblez .Net 2.0 à partir de VS2008.

Fondamentalement, tout ce qui n’est que du “sucre syntaxique” et les nouveaux compilateurs (C # 3.0, VB 9.0) émettent en tant que 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 delegates anonymes, les propriétés automatiques, les initialiseurs d’object et les initialiseurs de collection.

Certaines fonctionnalités LINQ utilisent des classes, des interfaces, des delegates et des méthodes d’extension qui résident dans les nouveaux assemblys 3.5 (tels que System.Core.dll). La redissortingbution de ces assemblées est une violation de licence, mais elles pourraient être réimplémentées. L’utilisation de méthodes d’extension nécessite uniquement que vous déclariez un System.Runtime.ComstackrServices.ExtensionAtsortingbute vide. LINQ to Objects s’appuie sur les extensions IEnumerable et plusieurs déclarations de délégué (familles Action et Func ) et a été implémentée dans LINQBridge (comme mentionné par mausch ). LINQ to XML et LINQ to DataSets reposent sur LINQ to Objects qui, je suppose, pourrait également être implémenté pour .Net 2.0, mais je ne l’ai pas encore vu.

LINQ to SQL et LINQ to Entities nécessitent de nombreuses nouvelles classes ( DataContext / ObjectContext , de nombreux atsortingbuts, EntitySet , EntityRef , Link , IQueryable , etc.) et des arborescences d’expression qui, même si en quelque sorte réimplémenté, nécessitera 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 avec les bibliothèques 3.5 à condition que vous utilisiez le compilateur VS 2008 pour cibler le framework 2.0.

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

LINQ utilise une transformation syntatique pour traduire les requêtes en code exécutable. Fondamentalement, il faudra un code comme celui-ci:

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

et le convertir 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 un ensemble de méthodes qui fonctionnent également sur les fichiers).

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

  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 utilisent les arbres d’expressions comme arguments, plutôt que comme lambdas. Ils ressemblent à ceci:

   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 

Les versions de l’arborescence des 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 ce que vous souhaitez d’autre).

Vous pourriez probablement créer votre propre version de LINQ aux objects dans environ une journée ou deux. C’est tout simple.

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

Non, car si vous pensiez que LINQ n’est en réalité que du sucre syntaxique, il utilisait en fait des arbres d’expression – une fonctionnalité absente de .NET 2.0.

Cela étant dit. NET 3.5 ne fait que monter sur .NET 2.0, et c’est la raison pour laquelle l’IL ne semble pas “différent” ou “spécial”.

Je ne vois pas de raison pour laquelle vous ne devriez pas simplement installer .NET 3.5 Framework. Tout ce que .NET 2.0 va bien fonctionner, promis 🙂

Pour 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é qu’un peu d’informations ici, mais cela ne m’a pas convaincu non plus.

Vous pouvez utiliser linqbridge pour .net 2.0