Desenvolvimento - ASP. NET
Conhecendo o LINQ (Language Integration Query)
Aprenda sobre os novos recursos da LINQ e como aplicá-los aos projetos desenvolvidos em C# e Visual Basic.net.
por Max Mosimann NettoIntrodução
LINQ (Language Integrated Query) é uma nova forma de realizar pesquisas em
conjuntos de dados, sejam relacionais ou não.
A idéia é utilizar uma sintaxe
muito semelhante à sintaxe SQL para realizar pesquisas em bloco de informações,
filtrando os dados (de forma horizontal ou vertical) quando necessário através
da associação de operadores.
Utilizando a IDE do Visual Studio como ambiente de desenvolvimento, o desenvolvedor poderá utilizar os recursos da LINQ juntamente com os benefícios da checagem em tempo de compilação e IntelliSense.
Além da possibilidade de execução de querys em blocos de informação, objetos e bancos de dados, uma extensão denominada XLinq foi criada para uso em arquivos e informações em XML. A facilidade de uso, permite que instruções XPAth e XQuery sejam executadas de maneira semelhante às instruções SQL.
Os operadores e as definições da LINQ farão parte da CLR (Common Lnguage Runtime). Devido a esta integração, essa nova tecnologia possuirá recursos de tipagem forte de dados, bem como otimização de performance baseadas em padrões .NET.
Esse novo recurso será parte integrante do Visual Studio codinome ORCAS e
estará disponível no Visual Basic.net 9.0 e C# 3.0.
Para informações sobre o
futuro Visual Studio, acesse: http://msdn.microsoft.com/vstudio/productinfo/roadmap.aspx#orcas
Para os entusiastas, a Microsoft preparou um pacote que permite instalar os recursos do LINQ no Visual Studio 2005 Beta 2. O download deve ser feito separadamente para o VB.NET e para o C#:
C# LINQ Tech Preview: http://download.microsoft.com/download/4/7/0/4703eba2-78c4-4b09-8912-69f6c38d3a56/LINQ%20Preview.msi
Visual Basic LINQ Tech Preview: http://download.microsoft.com/download/2/a/4/2a405b66-1b1c-4fca-bfbf-007aad63d307/LINQ%20VB%20Preview.msi
Usando LINQ em Collections
Depois de instalarmos os SDK (Tech Preview) para C# e Visual Basic, iremos
criar um projeto baseado no template Linq Preview.
1) Execute o Visual Studio
2005 Beta 2, clique em File | New | Project.
2) Em
Project Types escolha Visual C# | LINQ Preview
.
3) Na listagem Templates, escolha LINQ
Windows Application.
4) No Campo Name, informe o
nome LINQExemplo1 e clique em OK.
Um projeto muito
semelhante aos projetos WinForms será criado. A diferença primordial pode ser
vista nas importações dos namespaces:
Note que os namespaces
System.Data.DLinq, System.Query e
System.Xml.XLinq são novidades.
Adicione um botão com o
texto ordenar e um TextBox no formulário, como pode ser visto
na figura abaixo:
Dê um duplo clique no botão para acessar a codificação do
mesmo.
Adicione o seguinte trecho de código:
private void btnOrdenar_Click(object sender, EventArgs e) { var numbers = new int[] { 468, 7, 1, 4, 6, 3, 5, 8, 74, 81, 138}; var evenNumbers = from p in numbers where (p % 2) == 0 select p; foreach(var val in evenNumbers) { txtPares.Text += val + " "; } }Um simples array de inteiros foi criado e alguns número foram atribuídos como valores. Note que existem números pares e ímpares. Nosso objetivo é separar os números pares e mostra-los na caixa de texto.
O core de nosso código é a instrução var evenNumbers = from p in numbers where (p % 2) == 0 select p;
Uma instrução LINQ é executada usando o operador WHERE (P % 2) == 0 (ONDE o resto da divisão de P por 2 é igual a ZERO). Somente os números que se encontram nesta condição deverão ser retornados.
O resultado da execução do código pode se observado na figura abaixo:
Troque apenas a definição de IGUAL por DIFERENTE na expressão WHERE e obteremos os número ímpares:private void btnOrdenar_Click(object sender, EventArgs e) { var numbers = new int[] { 468, 7, 1, 4, 6, 3, 5, 8, 74, 81, 138}; var evenNumbers = from p in numbers where (p % 2) != 0 select p; foreach(var val in evenNumbers) { txtPares.Text += val + " "; } }Querys em Tipos Estruturados
Após aplicar o conceito de LINQ no exemplo anterior (tipos primitivos) vamos criar uma solução baseada em tipos estruturados.
Crie um novo projeto da mesma forma como o criado no exemplo anterior e chame-o de LINQExemplo2.
Adicione novamente um Button com o texto Filtrar e um textBox com a propriedade Multiline = True.
1) Clique no menu Project | Add Class.
2) Nomeie a classe como Person.cs
Adicione o código abaixo na classe:class Person { public int Idade; public string Nome; }Apenas criamos uma classe com duas variavéis públicas.
Dê um clique duplo sobre o botão para acessarmos a codificação para o evento click do mesmo e insira o código abaixo:private void btnFiltrar_Click(object sender, EventArgs e) { var people = new List(){ new Person {Idade=12,Nome="Carlos"}, new Person {Idade=18,Nome="Rita"}, new Person {Idade=16,Nome="Juliana"}, new Person {Idade=25,Nome="Paulo"}, new Person {Idade=28,Nome="Joseph"}, new Person {Idade=18,Nome="Andréa"} }; var teenagers = from p in people where p.Idade > 12 && p.Idade < 20 select p; foreach(var val in teenagers){ txtLista.Text += val.Nome + "\r\n"; } }Note que agora, criamos uma estrutura List em memória e executamos uma Query para filtrar as pessoas adolescentes (Idade > 12 e < 20).
Logo após mostramos todos os nomes selecionados.
Usando o operador ORDER BY
Além das tantas outras funcionalidades que a LINQ oferece, podemos trabalhar com o operador ORDER BY da mesma forma que com os demais. Para uma listagem completa dos operadores disponíveis, acesse: http://download.microsoft.com/download/c/f/b/cfbbc093-f3b3-4fdb-a170-604db2e29e99/Standard%20Query%20Operators.doc
Crie um novo projeto da mesma forma como o criado no exemplo anterior e chame-o de LINQExemplo3.
Adicione um Button com o texto Carregar, um GroupBox com dois RadioButtons (Crescente e Decrescente) e um textBox com a propriedade Multiline = True.
Dê um duplo clique no botão para acessar a codificação do evento click do mesmo e digite o código abaixo:private void btnCarregar_Click(object sender, EventArgs e) { txtLista.Text=""; int[] numbers = new int[] { 1, 4, 2, 7, 8, 9, 41, 54, 88, 44, 15, 76, 13, 49, 24, 37, 0 }; var evenNumbers = from p in numbers orderby p select p; if(rdbCrescente.Checked){ evenNumbers = from p in numbers orderby p select p; }else{ evenNumbers = from p in numbers orderby p descending select p; } foreach(var val in evenNumbers) { txtLista.Text += val + " "; } }Criamos uma array do tipo int e adicionamos alguns números aleatórios em suas posições.
Ao clicarmos no botão btnCarregar, um teste é feito para verificar qual dos radioButtons está checado. Caso o de ordem crescente esteja checado, os valores são exibidos seguindo o tipo de ordenação escolhido. Caso contrário, os valores serão ordenados de forma decrescente.
Conclusão
Muita coisa nova está surgindo, e cabe a nós desenvolvedores acompanharmos o mercado e estarmos atentos às novidades. A LINQ promete ser uma nova forma de trabalharmos com dados em memória e poderá ser muito útil em situações de trabalho com dados desconectados.
Para maiores informações sobre o projeto LINQ e para acompanhar as novidades, acesse: http://msdn.microsoft.com/netframework/future/linq/
Os exemplos desenvolvidos neste artigo podem ser obtidos aqui.