LINQ en .NET 2.0 Runtime

¿Se puede ejecutar una aplicación LINQ habilitada en una máquina que solo tiene instalado el tiempo de ejecución de .NET 2.0?

En teoría, LINQ no es más que azúcar sintáctica, y el código IL resultante debería tener el mismo aspecto que en .NET 2.0.

¿Cómo puedo escribir LINQ sin usar las librerías .NET 3.5? ¿Funcionará en .NET 2.0?

Hay algunos “Hacks” que implican el uso de un System.Core.dll desde el Framework 3.5 para que se ejecute con .net 2.0, pero personalmente no me gustaría utilizar una base tan inestable.

Vea aquí: Soporte de LINQ en .NET 2.0

  1. Crea una nueva aplicación de consola
  2. Mantenga solo System and System.Core como ensambles a los que se hace referencia
  3. Establezca Copy Local en true para System.Core, porque no existe en .NET 2.0
  4. Use una consulta LINQ en el método Principal. Por ejemplo, el de abajo.
  5. Construir
  6. Copie toda la salida de bin a una máquina donde solo está instalado .NET 2.0
  7. correr

(Requiere .net 2.0 SP1 y no tengo idea si agrupa el System.Core.dll viola el EULA)

Es extraño que nadie haya mencionado LINQBridge . Este pequeño y asombroso proyecto es un respaldo de LINQ (IEnumerable, pero sin IQueryable) y sus dependencias (Func, Action, etc.) a .NET 2.0. Y:

Si su proyecto hace referencia a LINQBridge durante la comstackción, se vinculará con los operadores de consulta de LINQBridge; si hace referencia a System.Core durante la comstackción, se vinculará a los operadores de consulta de Framework 3.5.

En teoría sí, siempre que distribuya los ensamblados específicos de LINQ y cualquier dependencia. Sin embargo, eso es una violación de las licencias de Microsoft. Scott Hanselman escribió una publicación en el blog sobre Implementación de ASP.NET MVC en ASP.NET 2.0, que es similar a lo que usted desea hacer.

Puede usar las fonts LINQ de mono (.NET para Linux) para ejecutar LINQ en .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 

Alguien lo ha hecho aquí:
LINQ para .NET 2.0

Respuesta corta:

  • LINQ to Objects: yes ( IEnumerable )
  • LINQ to SQL / Entities: no ( IQueryable )
  • LINQ a XML / DataSets: ¿todavía no?

Consulte esta pregunta acerca de las funciones de .Net 3.5 disponibles de forma automática o con poco esfuerzo cuando se trata de .Net 2.0 desde VS2008.

Básicamente, cualquier cosa que sea solo “azúcar de syntax” y los nuevos comstackdores (C # 3.0, VB 9.0) emitan como IL compatible con 2.0 funcionará. Esto incluye muchas características utilizadas por LINQ, como clases anónimas, lambdas como delegates anónimos, propiedades automáticas, inicializadores de objetos e inicializadores de colecciones.

Algunas características de LINQ utilizan clases, interfaces, delegates y métodos de extensión que viven en los nuevos ensamblados 3.5 (como System.Core.dll). La redistribución de estos ensamblajes es una violación de la licencia, pero podrían volverse a implementar. El uso de métodos de extensión solo requiere que declare un System.Runtime.CompilerServices.ExtensionAttribute vacío. LINQ to Objects se basa en las IEnumerable y varias declaraciones delegadas (las familias Action y Func ) y se han implementado en LINQBridge (como se menciona mausch ). LINQ to XML y LINQ to DataSets dependen de LINQ to Objects, que supongo que también podría implementarse para .Net 2.0, pero aún no lo he visto.

LINQ to SQL y LINQ to Entities requieren muchas clases nuevas ( DataContext / ObjectContext , muchos atributos, EntitySet , EntityRef , Link , IQueryable , etc.) y árboles de expresiones, que, incluso si de alguna manera reimplementado, probablemente requiera al menos .Net 2.0 SP1 para funcionar.

No estoy seguro de C #.

Sin embargo, sé que puede escribir código VB LINNQ sin las bibliotecas 3.5 siempre que use el comstackdor VS 2008 para orientar el marco 2.0.

Sin embargo, tendrá que implementar algunos de los métodos LINQ usted mismo.

LINQ usa una transformación sintáctica para traducir consultas en código ejecutable. Básicamente, tomará un código como este:

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

y convertirlo en un código como este:

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

Para la funcionalidad LINQ que se envía con el marco 3.5, esos métodos se implementan como métodos de extensión en IEnumerable o IQueryable (también hay un montón de métodos que también funcionan en los conjuntos de datos).

Los métodos de extensión predeterminados de IEnumerable se definen en System.Linq.Enumerable y se ven así:

  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 

Los métodos de extensión IQueryable toman árboles de expresiones como argumentos, en lugar de lambdas. Se ven así:

   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 

Las versiones del árbol de expresiones le permiten obtener una representación en árbol de las expresiones proporcionadas a las cláusulas que luego pueden usarse para generar código SQL (o lo que sea que desee).

Probablemente puedas crear tu propia versión de LINQ para objetos en aproximadamente un día más o menos. Todo es bastante directo.

Si quieres usar DLINQ, entonces las cosas serían un poco más difíciles.

No, porque si bien pensaste que LINQ es solo azúcar sintáctico, en realidad usó árboles de expresión en gran medida, una característica ausente en .NET 2.0.

Dicho esto, .NET 3.5 solo se construye sobre .NET 2.0, y esa es la razón por la cual el IL no se ve “diferente” o “especial”.

No veo una razón por la que no deba simplemente instalar .NET 3.5 Framework. Todo .NET 2.0 funcionará bien, prometa 🙂

Por lo que yo sé, la biblioteca LINQ solo está disponible desde el framework 3.0. Si desea utilizar algo similar en el marco 2.0, deberá volver a escribirlo usted mismo 🙂 o buscar una biblioteca de terceros similar. Solo encontré un poco de información aquí, pero tampoco me convenció.

Puedes usar linqbridge para .net 2.0