.net linq .net-3.5 .net-2.0 clr

LINQ en.NET 2.0 Runtime



.net-3.5 .net-2.0 (9)

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

¿Se puede ejecutar una aplicación habilitada para LINQ en una máquina que solo tiene instalado el tiempo de ejecución .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 tendría en .NET 2.0.

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


Es extraño que nadie haya mencionado LINQBridge . Este pequeño e impresionante proyecto es un backport 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 compilación, se unirá a los operadores de consulta de LINQBridge; si hace referencia a System.Core durante la compilación, se unirá a los operadores de consulta de Framework 3.5.


Hasta donde sé, la biblioteca LINQ solo está disponible desde el framework 3.0. Si desea utilizar algo similar en el marco 2.0, necesitaría reescribirlo usted mismo :) o buscar una biblioteca de terceros similar. Solo encontré un poco de información aquí, pero tampoco me convenció.


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

Ver aquí: soporte LINQ en .NET 2.0

  1. Crear una nueva aplicación de consola
  2. Mantenga solo System y System.Core como ensambles referenciados
  3. Establezca Copiar local en verdadero para System.Core, porque no existe en .NET 2.0
  4. Use una consulta LINQ en el método Main. Por ejemplo el de abajo.
  5. Construir
  6. Copie toda la salida del contenedor en una máquina donde solo esté instalado .NET 2.0
  7. correr

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


No estoy seguro acerca de C #.

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

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

LINQ utiliza 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 código como este:

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

Para la funcionalidad LINQ que se incluye 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 conjuntos de datos).

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

<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

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

<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

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

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

Si desea utilizar DLINQ, las cosas serían un poco más difíciles.


No, porque aunque pensabas que LINQ era realmente solo azúcar sintáctico, en realidad usaba mucho árboles de expresión, una característica ausente en .NET 2.0.

Dicho esto, .NET 3.5 solo se acumula 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 debas simplemente instalar .NET 3.5 Framework. Todo .NET 2.0 funcionará bien, lo prometo :)



Puede usar las fuentes LINQ de mono (.NET para Linux) para que LINQ se ejecute en .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

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


Respuesta corta:

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

Consulte esta pregunta sobre las características de .Net 3.5 disponibles de forma automática o con poco esfuerzo cuando apunte a .Net 2.0 de VS2008.

Básicamente, cualquier cosa que sea solo "azúcar de sintaxis" y los nuevos compiladores (C # 3.0, VB 9.0) emiten como IL compatible con 2.0 funcionará. Esto incluye muchas características utilizadas por LINQ, tales como clases anónimas, lambdas como delegados anónimos, propiedades automáticas, inicializadores de objeto e inicializadores de colección.

Algunas características de LINQ utilizan clases, interfaces, delegados y métodos de extensión que viven en los nuevos ensamblados 3.5 (como System.Core.dll). La redistribución de estos conjuntos es una violación de licencia, pero podrían volver a implementarse. El uso de métodos de extensión solo necesita que declare un System.Runtime.CompilerServices.ExtensionAttribute vacío. LINQ to Objects se basa en IEnumerable<T> y varias declaraciones de delegado (las familias Action<T> y Func<T> ) y se han implementado en LINQBridge (como se mencionó anteriormente). 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<T> , EntityRef<T> , Link<T> , IQueryable<T> , etc.) y árboles de expresión, que, incluso si reimplementado de alguna manera, probablemente requerirá al menos .Net 2.0 SP1 para funcionar.