Neste artigo exploraremos Language Integrated Query sob diferentes ângulos, analisando seu impacto em diferentes contextos e sua relevância hoje. Language Integrated Query é um tema que tem despertado o interesse de especialistas e do público em geral, gerando debates e questionamentos sobre suas implicações. Ao longo destas páginas, examinaremos diversas perspectivas e opiniões para abrir um espaço de reflexão e aprendizagem em torno de Language Integrated Query. Da sua origem à sua evolução na sociedade atual, este artigo procura oferecer uma visão panorâmica que convida à reflexão e à análise crítica.
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[1] ou analisadores sintáticos.[2]
Diversos dos conceitos introduzidos pelo LINQ foram originalmente testados no projeto Cω.
Os operadores suportados pela API estipulada são:[3]
SelectFaz uma projeção na coleção de dados para selecionar regiões relevantes entre os elementos.
WhereDefine regras de filtragem na coleção de dados que são avaliadas para cada item.
SelectManyMapeamento estipulado pelo programador de uma coleção de dados para coleções.
Sum, Min, Max, AverageEncontra a soma, o menor elemento, o maior elemento ou a média dos itens da coleção de dados, respectivamente.
AggregateUma versão generalizada de Sum, Min, Max.
Join, GroupJoinFaz a junção de duas coleções de dados, baseado em chaves de comum valor semântico em cada coleção.
Take, TakeWhileO 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, SkipWhileComplementos dos anteriores, eles ignoram os primeiros n objetos da coleção, ou enquanto há casamento com o predicado.
OfTypeSeleciona objetos de determinado tipo.
ConcatConcatena duas coleções.
OrderBy, ThenByO 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.
ReverseInverte a ordenação da coleção de dados.
GroupByExtrai uma chave e retorna uma coleção para cada chave.
DistinctRemove instâncias repetidas na coleção.
Union, Intersect, ExceptProvem união, interseção e complementar em duas sequências, respectivamente.
SequenceEqualVerifica se todos os elementos de duas coleções são iguais.
First, FirstOrDefault, Last, LastOrDefaultRetorna o primeiro elemento, o primeiro ou o valor padrão, o último, o último ou valor padrão da coleção de dados, respectivamente.
SingleRetorna o único elemento que casa um predicado dado. Havendo nenhum ou múltiplos casamentos, uma exceção é lançada.
ElementAtRetorna o elemento em determinado índice na coleção de dados.
Any, All, ContainsO 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.
CountConta a quantidade de elementos em uma coleção.
Ainda são especificados alguns operadores de conversão da coleção em outro tipo:[3]
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.