Pergunta

LINQ é um novo recurso do .NET 4.0, sem suporte em versões mais antigas, como NET 3.5? Qual é a utilidade disso? Parece ser capaz de construir árvores de expressão. O que é uma expressão de árvore, na verdade? LINQ é capaz de extrair informações como classe, método e campo de um arquivo C #?

Alguém pode me fornecer um pedaço de trabalho de código para demonstrar o LINQ pode fazer?

Foi útil?

Solução

LINQ é uma característica .NET 3,5 com embutido suporte de linguagem de C # 3.0 e Visual Basic 2008. Há uma abundância de exemplos no MSDN .

Outras dicas

Linq foi adicionado Net 3.5 (e adicionado ao C # 3.0 compilador, bem como na forma ligeiramente limitada ao VB.net compilador na mesma versão)

Na é Query Language integrado, embora ele cobre muitas adições complexas, tanto para a linguagem eo tempo de execução, a fim de alcançar este objectivo, que são úteis em si mesmos.

A funcionalidade de expressão é simplesmente colocar a capacidade de um programa, em tempo de execução, fiscalizar a sintaxe abstrata de certas construções de código passado ao redor. Estes são chamados lambdas. E são, em essência, uma forma de escrever funções anônimas mais facilmente enquanto fazer runtime introspecção de sua estrutura mais fácil.

O 'SQL como' funcionalidade Linq é mais associado com (embora de modo algum o único) é chamado Linq para Sql onde por algo como isto:

from f in Foo where s.Blah == "wibble" select f.Wobble;

é compilado em uma representação desta consulta, em vez de simplesmente código para executar a consulta. A parte que torna o LINQ to SQL é o 'back-end', que converte em sql. Por esta expressão é traduzida em declarações do SQL Server para executar a consulta contra uma base de dados ligada com o mapeamento de linhas para .net objetos e conversão do # lógica c em cláusulas equivalentes onde. Você poderia aplicar exatamente o mesmo código se Foo era uma coleção de objetos .net simples (em que ponto ele é "Linq para objetos") a conversão da expressão seria, então, ao código .Net reta.

O lambda acima escrita na forma como a linguagem integrada é realmente o equivalente a:

Foo.Where (f => f.Blah == "wibble) .Select (f => f.Wobble);

Onde Foo é uma coleção digitado. Para bases de dados classes são sintetizados de modo a representar os valores na base de dados para permitir que isso tanto de compilação, e para permitir o disparo em volta valores das áreas SQL para as áreas de NET e vice-versa.

O aspecto crítico da Integrado Idioma parte de Linq é que as construções de linguagem resultantes são primeiras partes de classe do código resultante. Em vez de simplesmente resultando numa função que fornece a forma como a função foi construído (como uma expressão) de modo que os outros aspectos do programa pode manipulá-la.

Os consumidores desta funcionalidade pode simplesmente escolheu para executá-lo (executar a função que o lambda é compilado para) ou pedir a expressão que descreve-lo e, em seguida, fazer algo diferente com ele.

Muitos aspectos do que torna isso possível são colocados sob a bandeira "Linq" apesar de não estar realmente themsleves Linq.
Por exemplo tipos anônimos são necessários para facilitar o uso de projection (escolha de um subconjunto das propriedades possíveis), mas tipos anônimos pode ser usado fora do Linq também.

Linq, especialmente através dos lambdas (que fazem escrever delegados anônimos muito leve em termos de sintaxe) levou a um aumento das capacidades funcionais do c #. isso é reforçado pelos métodos de extensão no IEnumerable<T> como Select (), correspondendo a map em muitas línguas de função e onde () correspondente a filter. Como os tipos anônimos isso não é por si só "Linq" que é visto por muitos como um efeito fortemente benéfico sobre c # desenvolvimento (isto não é uma visão universal, mas é amplamente realizada).

As expressões são um a mais avançadapic, e compreensão deles é totalmente desnecessário para uso LINQ, embora sejam possíveis usando-os certos 'truques'. Em geral, você se importaria com expressões somente se você estava tentando provedores LINQ gravação que é o código para tirar uma expressão em vez de apenas uma função e usar isso para fazer algo diferente do que a função simples seria fazer, como falar com uma fonte de dados externa .

Outros usos seria quando você deseja obter alguns metadados sobre o que os internos da função está fazendo, talvez, em seguida, compilar a expressão (resultando em um delegado que permitirá que você para executar a expressão como uma função) e fazer algo com ele ou apenas olhando para os metadados dos objetos para fazer código reflexivo que é tempo de compilação verificado como esta resposta mostra .

Uma área de esta pergunta que não tenha sido coberto ainda é árvores de expressão. Há um artigo muito bom sobre árvores de expressão (e expressão lambda) disponíveis aqui .

A outra coisa importante para trazer cerca de árvores de expressão é que através da construção de uma árvore de expressão para definir o que você são vai fazer, você não tem que realmente faça qualquer coisa. Refiro-me à execução diferida.

//this code will only build the expression tree
var itemsInStock = from item in warehouse.Items
                   where item.Quantity > 0;

// this code will cause the actual execution
Console.WriteLine("Items in stock: {0}", itemsInStock.Count());

LINQ foi introduzido com o .NET 3.5. Este site tem um monte de exemplos.

Isso também é coberto bastante extensa aqui no SO .

System.Linq.Expressions é para a construção de mão (ou gerador de máquina) árvores de expressão. Tenho a sensação de que, dada a complexidade da construção de funcionalidade mais complicado que este namespace está sob utilizado. No entanto, é extremamente poderoso. Por exemplo, um dos meus colegas de trabalho recentemente implementou uma árvore de expressão que escala pode auto qualquer LINQ to SQL objeto usando uma função de densidade cumultive. Cada coluna tem sua própria árvore que é compilado pelo que a sua rápida. Tenho vindo a construir um compilador especializada que os usa extensivamente para implementar a funcionalidade básica, bem como cola o resto do código gerado juntos.

Por favor, veja este post para obter mais informações e ideias.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top