2. Consiste em um modelo de programação unificado
para extrair e atualizar dados de diferentes fontes de
dados . Desta forma, é possível criar consultas a partir
de uma coleção, um banco de dados e utilizar uma
sintaxe conhecida, como o C#, por exemplo.
3. Existem 3 diferentes operações de consulta LINQ:
Obter a origem de dados;
Criar a consulta;
Executar a consulta;
A origem de dados pode ser um array, uma
coleção, um documento XML, um banco de dados ou um
objeto que suporte Ienumerable etc.
4. No exemplo a seguir , a origem de dados é uma coleção:
int[] num = new int[11] {0,1,2,3,4,5,6,7,8,9,10} ;
var obj = from p in num
where p > 5
select p;
A cláusula “from” define a origem de dados:
var obj = from p in num
“where” filtra:
where p > 5
Os operadores condicionais “OR”:
where p == 5 || p == 6
e “AND” também podem ser usados:
where p == 5 && p == 6
5. A cláusula “select” aparece no final e executa a consulta:
var obj = from p in num
where p > 5
select p;
Caso queira exibir campos específicos, defina as propriedades que contêm
os dados como por exemplo:
var produtos = from p in db.Produtos
select new { p.CategoriaID, p.ProdutoNome, p.PrecoUnitario };
Para executar, use uma instrução for ou foreach. Exemplo:
int[] num = new int[11] {0,1,2,3,4,5,6,7,8,9,10} ;
var obj = from p in num
where p > 5
select p;
foreach(var item obj)
{ Response.Write(item + “<br/>”); }
6. Podemos exibir as informações em um controle DataGridView:
//Retorna uma lista de produtos ordenados em ordem crescente pelo nome
var produtos = from p in db.Produtos
orderby p.ProdutoNome
select p;
//Retorna uma lista de produtos ordenados em ordem decrescente pelo nome
var produtos = from p in db.Produtos
orderby p.ProdutoNome descending
select p;
DataGridView.DataSource = produtos;
Se preferir retornar imediatamente as informações especificadas na
consulta use:
var produtos = (from p in db.Produtos
select p).ToList();
var produtos = (from p in db.Produtos
select p).ToArray();
7. Caso queira retornar, como por exemplo, apenas os 10 primeiros produtos
que possuem o Id maior do que 15 e ordenados pelo Nome:
var produtos = (from p in db.Produtos
where p.ProdutoID > 15
orderby p.ProdutoNome
select p).Take(10);
Para agrupar elementos, use a cláusula “group”:
var produtos = from p in db.Produtos
group p by p.CategoriaID into grupo
from item in grupo
select new
{ item.CategoriaID, item.ProdutoID, item.ProdutoNome,
item.PrecoUnitario };
8. Funçoes de pesquisa
• Contains : Pesquisa na respectiva propriedade o texto declarado. Corresponde ao
‘LIKE’ nas expressões SQL. Exemplo (retornar todos os produtos que contém a
expressão “guaraná” em seu nome):
var produtos = from p in db.Produtos
where p.ProdutoNome.Contains(“guaraná”)
select p ;
• StartsWith : Pesquisa pelo início da expressão. Exemplo (retornar todos os
produtos que iniciam com a letra “a”):
var produtos = from p in db.Produtos
where p.ProdutoNome.StartsWith(“a”)
select p ;
• EndsWith : Pesquisa pelo final da expressão. Exemplo (retornar todos os
produtos que terminam com a letra “a”):
var produtos = from p in db.Produtos
where p.ProdutoNome.EndsWith(“a”)
select p ;
9. • FirstOrDefault : Quando se faz uma pesquisa, nem sempre temos certeza de
que o dado existe. Como o “First()” retorna uma exceção, caso não encontre o
dado, pode implicar em diversos erros na programação, então use o tratamento
de erro try/catch. Já com o FirstOrDefault() é diferente, pois caso o dado não
exista, não será gerada uma exceção, e sim será mostrado o valor Default.
Exemplo (retornar o primeiro produto que começa com a letra “a”) :
var produtos = (from p in db.Produtos
where p.ProdutoNome.StartsWith(“a”)
select p).FirstOrDefault();
Obs: caso o produto não exista será retornado o valor padrão do objeto, ou seja, o
valor “null” (valor nulo);
• Any : Verifica se um determinado elemento existe em uma coleção. O retorno é
um valor lógico, True ou False. Exemplo:
Verificar se existe o texto “aldo” na coleção:
string[] nomes = {“Sabrina”, “Karina”, “Reginaldo”} ;
var pesquisa = (from n in nomes
where n.Contains(“aldo”)
select n).Any(); // retorna True
10. Verificar se existe se existe algum cliente que nunca tenha feito um pedido:
//verifica se há algum cliente sem pedido
var resultado = from c in db.Clientes
where !c.Pedidos.Any()
select c;
Uso de JOIN
O “join” é utilizado quando precisamos unir dados de duas ou mais
tabelas. No exemplo a seguir as classes requisitadas são Clientes e Pedidos que
representam tabelas de mesmo nome em um banco de dados. No exemplo
mostrado a seguir, iremos mostrar quantos pedidos existem para cada cliente:
//agrupando com Join
var dados = from c in db.Clientes
join o in db.Pedidos
on c.ClienteID equals o.ClienteID
into pedidos
select new {Cliente = c.Nome, QtdePedidos = pedidos.Count()};
11. No bloco a seguir é declarada no “from” a clase Clientes na variável “c”. Como
precisamos unir à classe Pedidos, usamos a declaração do “join” na variável “o”:
var dados = from c in db.Clientes
join o in db.Pedidos
Até aqui as classes estão unidas, porém é necessário informar a propriedade-chave
(ou campo da tabela) que liga ambas as classes:
on c.ClienteID equals o.ClienteID
O “into” é a lista a ser gerada e o “select new” usa o tipo anônimo para criar as duas
propriedades “Cliente” e “QtdePedidos” em tempo de execução. Observe o uso do
Count() na classe pedidos indicando que será capturada a quantidade de linhas
existentes, ou seja, pedidos é uma lista e a partir dela podemos extrair diversas
funções de agregação como Count(), Avg(), Max(), Min() etc:
into pedidos
select new
{
Cliente = c.Nome,
QtdePedidos = pedidos.Count()
};
12. Expressões lambda:
A expressão lambda é uma função anônima e pode conter expressões e
instruções. Todas as expressões lambda usam o operador “=>”. À esquerda do
operador =>, temos os parâmetros de entrada e à direita, as expressões e
instruções.
Exemplo:
var produtos =
db.Produtos
.Where(p=> p.Discontinued == true)
.Select(s=> new {Nome = p.ProdutoNome, UnidadesEmEstoque =
p.UnidadesEmEstoque, PrecoUnitario =
s.PrecoUnitario});
13. Fontes:
Como Programar com ASP.NET e C# - 2ª Edição –
Alfredo Lotar;
LINQ e C# 3.0 – 1ª Edição – Renato Haddad
Autor:
Fabiano Roman Beraldi – fabiano.beraldi@outlook.com