LINQ no tempo de execução .NET 2.0

votos
53

Pode um LINQ habilitado aplicativo executado em uma máquina que só o tempo de execução .NET 2.0 instalado?

Em teoria, LINQ não é nada mais do que o açúcar sintático, eo código IL resultante deve ser a mesma que teria em .NET 2.0.

Como posso escrever LINQ sem usar o .NET 3.5 bibliotecas? Será que vai ser executado em .NET 2.0?

Publicado 05/08/2008 em 13:03
fonte usuário
Em outras línguas...                            


9 respostas

votos
76

É estranho que ninguém tenha mencionado LINQBridge . Este pequeno projeto impressionante é um backport de LINQ (IEnumerable, mas sem IQueryable) e suas dependências (Func, ação, etc) para .NET 2.0. E:

Se o seu projeto referencia LINQBridge durante a compilação, então ele vai ligar-se a operadores de consulta de LINQBridge; se ele faz referência System.Core durante a compilação, então ele vai ligar-se a operadores de consulta Framework 3.5 do.

Respondeu 27/12/2008 em 03:51
fonte usuário

votos
32

Existem alguns "hacks" que envolvem o uso de um System.Core.dll do 3.5 Framework para fazê-lo funcionar com .NET 2.0, mas pessoalmente eu não iria querer usar uma base tal um pouco instável.

Veja aqui: apoio LINQ no .NET 2.0

  1. Criar um novo aplicativo de console
  2. Manter apenas Sistema e System.Core como assemblies referenciados
  3. Definir Copy Local como true para System.Core, porque não existe no .NET 2.0
  4. Use uma consulta LINQ no método principal. Por exemplo, a um abaixo.
  5. Construir
  6. Copiar todo o compartimento de saída para uma máquina onde apenas .NET 2.0 é instalado
  7. Corre

(Requer .NET 2.0 SP1 e eu não tenho idéia se a agregação a System.Core.dll viola o EULA)

Respondeu 05/08/2008 em 13:07
fonte usuário

votos
11

Em teoria sim, desde que você distribuir as assembleias específicas LINQ e quaisquer dependências. No entanto, que é em violação de licenciamento da Microsoft. Scott Hanselman escreveu um post sobre Implantação ASP.NET MVC em ASP.NET 2.0 que é semelhante ao que você está querendo fazer.

Respondeu 05/08/2008 em 13:07
fonte usuário

votos
7

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

Alguém já fez isso aqui:
LINQ para .NET 2.0

Respondeu 04/03/2011 em 19:51
fonte usuário

votos
6

Resposta curta:

  • LINQ to Objects: sim ( IEnumerable<T>)
  • LINQ to SQL / Entidades: não ( IQueryable<T>)
  • LINQ para XML / DataSets: Not Yet?

Veja esta pergunta sobre NET 3.5 recursos disponíveis automaticamente ou com pouco esforço quando targetting Net 2.0 do VS2008.

Basicamente, qualquer coisa que é apenas "açúcar sintaxe" e os novos compiladores (C # 3.0, 9.0 VB) emitem como 2,0-IL compatível irá funcionar. Isto inclui muitos recursos usados ​​pelo LINQ como classes anônimas, lambdas como delegados anônimos, propriedades automáticas, inicializadores de objeto, e inicializadores de coleção.

Alguns recursos LINQ usar classes, interfaces, delegados e métodos de extensão que vivem nos novos 3,5 assembléias (como System.Core.dll). Redistribuindo estes conjuntos é uma violação de licença, mas eles poderiam ser reimplantado. Usando métodos de extensão só precisa que você declarar um vazio System.Runtime.CompilerServices.ExtensionAttribute. LINQ para objetos depende de IEnumerable<T>extensões e várias declarações de delegados (as Action<T>e Func<T>famílias) e têm sido implementadas em LINQBridge (como mausch mencionado). LINQ to XML e LINQ para DataSets contar com LINQ para objetos que eu acho que também poderia ser implementado para .Net 2.0, mas eu não vi esse feito ainda.

LINQ to SQL e LINQ to Entities exigir muitas novas classes ( DataContext/ ObjectContext, os lotes de atributos, EntitySet<T>, EntityRef<T>, Link<T>, IQueryable<T>, etc) e árvores, que, mesmo que de alguma forma reimplemented, provavelmente requerem pelo menos .Net 2.0 SP1 para trabalhar expressão.

Respondeu 19/05/2009 em 17:19
fonte usuário

votos
5

Eu não tenho certeza sobre C #.

Eu sei, porém, que você pode escrever código VB LINNQ w / out os 3,5 bibliotecas, desde que você use o compilador VS 2008 para atingir o quadro 2.0.

Poderá, no entanto, tem que implementar alguns dos métodos LINQ seu self.

LINQ utiliza uma transformação sintático para traduzir consultas em código executável. Basicamente, vai demorar um código como este:

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

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

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

Para a funcionalidade LINQ que acompanha o quadro 3.5, esses métodos são implementados como métodos de extensão em ambos os IEnumerable ou IQueryable (há também um monte de métodos que funcionam em conjuntos de dados também).

Os métodos de extensão IEnumerable padrão são definidos no System.Linq.Enumerable e parecido com este:

<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

Os métodos de extensão IQueryable tomar expressões árvores como argumentos, ao invés de lambdas. Eles se parecem com isto:

 <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

As versões árvore de expressão que lhe permitem obter uma representação em árvore das expressões fornecidas às cláusulas que podem então ser usados ​​para gerar código SQL (ou que nunca mais você quiser).

Você provavelmente poderia criar sua própria versão do LINQ a objetos em cerca de um ou dois dias. É tudo muito certinho.

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

Respondeu 10/10/2008 em 22:30
fonte usuário

votos
3

Não, porque enquanto você pensou LINQ é realmente apenas açúcar sintático, é árvores de expressão efectivamente utilizadas fortemente - uma característica ausente em .NET 2.0.

Dito .NET 3.5 somente se acumula em cima do .NET 2.0, e essa é a razão pela qual a IL não parece "diferente" ou "especial".

Eu não vejo uma razão pela qual você não deve apenas instalar o .NET Framework 3.5. Tudo .NET 2.0 irá funcionar bem sobre ele, prometo :)

Respondeu 05/08/2008 em 13:07
fonte usuário

votos
2

Tanto quanto eu sei a biblioteca LINQ só está disponível desde o quadro 3.0. Se você quiser usar algo semelhante no quadro 2.0, você precisaria regravada-lo sozinho :) ou encontrar uma biblioteca de terceiros similar. Eu só encontrei um pouco de informação aqui mas não me convenceu tanto.

Respondeu 05/08/2008 em 13:14
fonte usuário

votos
0

Você pode usar LINQBridge para .NET 2.0

Respondeu 25/03/2015 em 20:05
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more