# Language Integrated Query

Language Integrated Query (LINQ) é um componente do Microsoft .NET que adiciona funcionalidades de consulta em algumas linguagens de programação .NET. O LINQ corresponde a uma sintaxe unificada, inicialmente incorporada às linguagens C# e Visual Basic, para consultas em fontes de dados variadas. A linguagem foi introduzida inicialmente nas linguagens Visual Basic 9.0 (Visual Basic 2008) e C# 3.0 (Visual C# 2008), em 19 de novembro de 2007 com o .NET Framework 3.5 e o Visual Studio 2008.
A sintaxe de consulta da LINQ foi inspirada na da Structured Query Language (SQL), que é uma linguagem padrão para comunicação com bancos de dados relacionais. Assim como na linguagem SQL, as expressões de consulta LINQ permitem a construção de instruções variadas para extração de informações.
Ele define um conjunto de métodos chamados operadores de consulta, expressões lambda e tipos anônimos.
Com o conjunto, pode se por exemplo projetar ou filtrar informação em vetores, coleções de objetos do tipo IEnumerable<T> (LINQ to Objects), manipulação de XML em memória (LINQ to XML), infraestrutura para gerenciar dados relacionais como objetos, este componente permite fazer mapeamento objeto-relacional em um modelo de dados de um banco de dados relacional (atualmente só existe Provider para SQL Server) (LINQ to SQL), consulta de objetos do tipo Conjunto de dados na memória (LINQ to DataSet) entre outros. Outros usos mais especializados incluem processadores de eventos ou analisadores sintáticos.
Diversos dos conceitos introduzidos pelo LINQ foram originalmente testados no projeto Cω.

## Arquitetura no .NET 3.5
### Operadores

Os operadores suportados pela API estipulada são:

#### Select

Faz uma projeção na coleção de dados para selecionar regiões relevantes entre os elementos.

#### Where

Define regras de filtragem na coleção de dados que são avaliadas para cada item.

#### SelectMany

Mapeamento estipulado pelo programador de uma coleção de dados para coleções.

#### Sum, Min, Max, Average

Encontra a soma, o menor elemento, o maior elemento ou a média dos itens da coleção de dados, respectivamente.

#### Aggregate

Uma versão generalizada de Sum, Min, Max.

#### Join, GroupJoin

Faz a junção de duas coleções de dados, baseado em chaves de comum valor semântico em cada coleção.

#### Take, TakeWhile

O primeiro seleciona os primeiros n ojectos da coleção, enquanto o segundo toma um predicado que seleciona os objectos que casam com o predicado.

#### Skip, SkipWhile

Complementos dos anteriores, eles ignoram os primeiros n objetos da coleção, ou enquanto há casamento com o predicado.

#### OfType

Seleciona objetos de determinado tipo.

#### Concat

Concatena duas coleções.

#### OrderBy, ThenBy

O primeiro determina o critério de ordenação da coleção de dados, ascendente por padrão. O segundo especifica critérios subsequentes de ordenação.

#### Reverse

Inverte a ordenação da coleção de dados.

#### GroupBy

Extrai uma chave e retorna uma coleção para cada chave.

#### Distinct

Remove instâncias repetidas na coleção.

#### Union, Intersect, Except

Provem união, interseção e complementar em duas sequências, respectivamente.

#### SequenceEqual

Verifica se todos os elementos de duas coleções são iguais.

#### First, FirstOrDefault, Last, LastOrDefault

Retorna o primeiro elemento, o primeiro ou o valor padrão, o último, o último ou valor padrão da coleção de dados, respectivamente.

#### Single

Retorna o único elemento que casa um predicado dado. Havendo nenhum ou múltiplos casamentos, uma exceção é lançada.

#### ElementAt

Retorna o elemento em determinado índice na coleção de dados.

#### Any, All, Contains

O primeiro verifica se algum elemento da coleção casa o predicado. O segundo verifica se todos os elementos da coleção casam o predicado. O terceiro verifica se a coleção contém determinado valor.

#### Count

Conta a quantidade de elementos em uma coleção.
Ainda são especificados alguns operadores de conversão da coleção em outro tipo:
* AsEnumerable: converte para IEnumerable<T>.
* ToQueryable: converte para IQueryable<T>.
* ToArray: converte para vetor.
* ToList: converte para IList<T>.
* ToDictionary: converte para IDictionary<K, T>, indexado por K.
* ToLookup: converte para ILookup<K, T>, indexado por K.
* Cast: converte uma coleção IEnumerable não-genérica para uma IEnumerable<T>, por conversão de tipo.
* OfType: converte uma coleção IEnumerable não-genérica para uma IEnumerable<T>, incluindo somente elementos do tipo T.