LINQ no tempo de execução do .NET 2.0

Um aplicativo habilitado para LINQ pode ser executado em uma máquina que possui apenas o runtime do .NET 2.0 instalado?

Em teoria, o LINQ nada mais é do que o açúcar sintático, e o código IL resultante deve ter a mesma aparência que teria no .NET 2.0.

Como posso escrever o LINQ sem usar as bibliotecas do .NET 3.5? Será executado no .NET 2.0?

Existem alguns “Hacks” que envolvem o uso de um System.Core.dll do 3.5 Framework para executá-lo com o .net 2.0, mas pessoalmente eu não gostaria de usar uma base tão instável.

Veja aqui: Suporte LINQ no .NET 2.0

  1. Crie um novo aplicativo de console
  2. Mantenha apenas System e System.Core como assemblies referenciados
  3. Defina Copy Local como true para System.Core, porque ele não existe no .NET 2.0
  4. Use uma consulta LINQ no método Main. Por exemplo, o abaixo.
  5. Construir
  6. Copie toda a saída da bandeja para uma máquina onde somente o .NET 2.0 esteja instalado
  7. Corre

(Requer .net 2. 0 SP1 e não tenho idéia se agrupar o System.Core.dll viola o EULA)

É estranho que ninguém tenha mencionado o LINQBridge . Este pequeno projeto incrível é um backport do LINQ (IEnumerable, mas sem IQueryable) e suas dependencies (Func, Action, etc) para o .NET 2.0. E:

Se o seu projeto fizer referência ao LINQBridge durante a compilation, ele será vinculado aos operadores de consulta do LINQBridge; se referenciar System.Core durante a compilation, então se ligará aos operadores de consulta do Framework 3.5.

Em teoria, sim, desde que você distribua os assemblies específicos do LINQ e quaisquer dependencies. No entanto, isso viola o licenciamento da Microsoft. Scott Hanselman escreveu uma postagem no blog sobre Como implantar a ASP.NET MVC no ASP.NET 2.0, que é semelhante ao que você está querendo fazer.

Você pode usar as fonts LINQ de mono (.NET para Linux) para obter o LINQ em execução no .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 

Alguém fez isso aqui:
LINQ for .NET 2.0

Resposta curta:

  • LINQ para objects: sim ( IEnumerable )
  • LINQ para SQL / Entidades: não ( IQueryable )
  • LINQ to XML / DataSets: ainda não?

Veja esta pergunta sobre os resources do .Net 3.5 disponíveis automaticamente ou com pouco esforço ao direcionar o .Net 2.0 do VS2008.

Basicamente, qualquer coisa que seja apenas “syntax sugar” e os novos compiladores (C # 3.0, VB 9.0) emitem como IL compatível com 2.0 funcionará. Isso inclui muitos resources usados ​​pelo LINQ, como classs anônimas, lambdas como representantes anônimos, propriedades automáticas, inicializadores de objects e inicializadores de coleção.

Alguns resources do LINQ usam classs, interfaces, representantes e methods de extensão que residem nos novos assemblies 3.5 (como System.Core.dll). Redistribuir esses assemblies é uma violação de licença, mas eles podem ser reimplementados. Usar methods de extensão só precisa declarar um System.Runtime.CompilerServices.ExtensionAttribute vazio. O LINQ to Objects depende de extensões IEnumerable e várias declarações de delegação (as famílias Action e Func ) e foram implementadas no LINQBridge (como mencionado em mausch ). LINQ para XML e LINQ para DataSets dependem LINQ to Objects que eu acho que também poderia ser implementado para .net 2.0, mas eu não vi isso feito ainda.

LINQ to SQL e LINQ to Entities requerem muitas novas classs ( DataContext / ObjectContext , muitos atributos, EntitySet , EntityRef , Link , IQueryable , etc) e trees de expressão, que, mesmo se de alguma forma reimplementada, provavelmente exigirá pelo menos .Net 2.0 SP1 para funcionar.

Eu não tenho certeza sobre o C #.

Eu sei, no entanto, que você pode escrever o código VB LINNQ sem as bibliotecas 3.5 contanto que você use o compilador VS 2008 para direcionar a estrutura 2.0.

Você terá, no entanto, que implementar alguns dos seus methods LINQ.

O LINQ usa uma transformação sintática para converter consultas em código executável. Basicamente, ele vai tomar código como este:

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

e convertê-lo em código como este:

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

Para a funcionalidade LINQ fornecida com a estrutura 3.5, esses methods são implementados como methods de extensão em IEnumerable ou IQueryable (também há vários methods que também funcionam em conjuntos de dados).

Os methods de extensão IEnumerable padrão são definidos em System.Linq.Enumerable e se parecem com isto:

  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 

Os methods de extensão IQueryable usam trees de expressões como argumentos, em vez de lambdas. Eles se parecem com isso:

   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 

As versões da tree de expressão permitem que você obtenha uma representação em tree das expressões fornecidas para as cláusulas que podem ser usadas para gerar código SQL (ou o que você quiser).

Você provavelmente poderia criar sua própria versão do LINQ para objects em aproximadamente um dia. Tudo é bem direto.

Se você quiser usar DLINQ, então as coisas seriam um pouco mais difíceis.

Não, porque apesar de você achar que o LINQ é realmente apenas o açúcar sintático, ele realmente usa trees de expressão – um recurso ausente no .NET 2.0.

Dito isto, o .NET 3.5 só se baseia no .NET 2.0, e essa é a razão pela qual o IL não parece “diferente” ou “especial”.

Eu não vejo uma razão pela qual você não deve simplesmente instalar o .NET 3.5 Framework. Tudo o que o .NET 2.0 funcionará bem, prometa 🙂

Tanto quanto eu sei a biblioteca LINQ só está disponível desde o framework 3.0. Se você quiser usar algo semelhante no framework 2.0, você precisará reescrevê-lo você mesmo 🙂 ou encontrar uma biblioteca de terceiros similar. Eu só encontrei um pouco de informação aqui, mas também não me convenceu.

Você pode usar o linqbridge para .net 2.0