LINQ - Consultas com estilo Fluent e Query Expression - II
Neste artigo vou apresentar o estilo Fluent e o estilo Query Expression para criar consultas LINQ. |
Se você não conhece os conceitos básicos sobre LINQ leia meus artigos citados nas referências. Neste artigo eu vou falar um pouco sobre LINQ Queries e os estilos para escrever consultas LINQ.
Existem dois estilos para escrever consultas LINQ:
Fluent style ou Fluent sintax
Query Expression Style
Continuando o artigo anterior vamos abordar o Query Expression Style.
2- Query Expression Style
A sintaxe Query Expression nas consultas LINQ é um conjunto de palavras-chave de consulta incorporadas no framework .NET (3.5 e superior) que permitem ao desenvolvedor escrever comandos ao estilo SQL na linha diretamente no editor de código, sem o uso de aspas.
As principais palavras-chaves de consultas usadas na sintaxe Query Expression são:
from/in - Especifica a fonte de dados
where - Permite filtrar a sequência usandao uma condição
orderby (ascending/descending) - Ordena o resultado(ascendente ou descendente)
select - Adiciona o resultado ao tipo de retorno;
group/by - Agrupa o resultado baseado em uma chave especificada;
Em uma consulta LINQ usando Query Expression como no exemplo abaixo:
int[]
numeros = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
var resultado = from numero in numeros select numero;
observe que temos uma lógica de declaração invertida em relação a uma consulta SQL. Compare:
SQL | select numero from numeros |
LINQ | from numero in numeros select numero; |
Percebeu que no código definimos uma variável chamada numero do tipo integer? (O tipo esta sendo inferido pelo compilador pois não esta declarado no código.)
A variável resultado também esta sendo inferida como sendo do tipo Sytem.Collections.Generic.IEnumerable<int>.
Agora vamos ao nosso exemplo...
Abaixo vemos o mesmo código usado na primeira parte do artigo usando o estilo Query Expression na consulta LINQ:
using System;
using System.Collections.Generic;
using System.Linq;
namespace LINQ_Consultas
{
class Ingrediente
{
public string Nome { get; set; }
public int Calorias { get; set; }
}
class Program
{
static void Main(string[] args)
{
Ingrediente[] ingredientes =
{
new Ingrediente{Nome = "Açucar", Calorias=500},
new Ingrediente{Nome = "Ovo", Calorias=100},
new Ingrediente{Nome = "Leite", Calorias=150},
new Ingrediente{Nome = "Farinha", Calorias=50},
new Ingrediente{Nome = "Manteiga", Calorias=200},
new Ingrediente{Nome = "Oléo", Calorias=160}
};
IEnumerable<string> consultaIngredientesComMaisCalorias =
from i in ingredientes
where i.Calorias >= 150
orderby i.Nome
select i.Nome;
foreach (var ingredienteNome in consultaIngredientesComMaisCalorias)
{
Console.WriteLine(ingredienteNome);
}
Console.ReadLine(); } } } |
Vamos considerar o código da consulta LINQ abaixo e do resultado obtido ao lado :
IEnumerable<string>
consultaIngredientesComMaisCalorias = from i in ingredientes where i.Calorias >= 150 orderby i.Nome select i.Nome;
foreach (var ingredienteNome in
consultaIngredientesComMaisCalorias) |
As etapas
que são executadas são as mesmas que na versão de sintaxe fluente, com cada
cláusula de consulta (from, where, orderby, select)
passando uma seqüência modificada para a próxima cláusula de consulta.
A expressão de consulta começa com a cláusula from. Esta cláusula tem
dois propósitos:
1- O primeiro é descrever qual é a seqüência de entrada (neste
caso, ingredientes);
2- O segundo é apresentar uma variável de alcance(range)
A cláusula final é a cláusula select, que descreve o que a sequência de
saída será. Assim como com a versão de sintaxe fluente, a cláusula select
no código acima está projetando uma seqüência de objetos ingredientes em
uma seqüência de objetos de string.
Entre as duas sintaxes a sintaxe Fluent apresenta um código mais limpo
para consultas mais complexas, além do que a sintaxe Query Expression não
suporta todos os operadores LINQ padrão.
Nota: Os métodos de extensão Count(), Aggregate(), Take(), Skip(), ToList(), ToArray() estão disponíveis apenas na sintaxe Fluent.
Se você consultar a MSDN e analisar os exemplos, parece que a Microsoft prefere usar a Query Expression.
"E disse-lhes: Ide por todo omundo,
pregai o evangelho a toda criatura. Quem crer e for batizado será salvo; mas
quem não crer será condenado."
Marcos 16:15,16
Gostou ? Compartilhe no Facebook Compartilhe no Twitter
Referências:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
Apresentando LINQ - Language Integrated Query - Macoratti.net
NET - LINQ a seu dispor - Sintaxe e Operadores - Macoratti.net
LINQ - Consultas Dinâmicas usando LINQ Dynamic Query Library
LINQ to SQL - Criando e usando um DataContext - Macoratti.net