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 Netto



Introduçã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.

Max Mosimann Netto

Max Mosimann Netto - Fundador e coordenador do grupo Codificando.net (http://www.codificando.net). Atualmente presta consultoria na área de mobile business, desenvolvendo aplicações para web, pocket, celular e smartphone.
TheSpoke: http://br.thespoke.net/MyBlog/max/MyBlog.aspx