Language Integrated Query
(Fundamentos)
 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.
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.
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
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/>”); }
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();
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 };
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 ;
• 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
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()};
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()
};
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});
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

Noçoes de LINQ

  • 1.
  • 2.
     Consiste emum 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 diferentesoperaçõ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 aseguir , 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 asinformaçõ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 existese 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 aseguir é 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ãolambda é 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 Programarcom 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