LINQ - Consultas com estilo Fluent e Query Expression - I
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
Vejamos cada um deles em detalhes.
1- Fluent Style
A sintaxe
Fluent usa métodos de extensão do operador da consulta conforme definido na
classe estática System.Linq.Enumerable.
Esses métodos de extensão adicionam métodos adicionais para instâncias de
IEnumerable<TSource>, e , isso significa que qualquer instância de uma
classe que implementa essa interface pode usar esses métodos de extensão.
Os operadores de consulta podem ser usados de forma singular ou encadeados
para criar consultas mais complexas. Vamos a um exemplo:
Operadores de consulta encadeados
Crie um projeto do tipo Console Application e inclua o código abaixo no arquivo Program.cs :
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 =
ingredientes.Where(x => x.Calorias >= 150)
.OrderBy(x => x.Nome)
.Select(x => x.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 = ingredientes.Where(x => x.Calorias >= 150) .OrderBy(x => x.Nome) .Select(x => x.Nome);
foreach (var ingredienteNome in
consultaIngredientesComMaisCalorias) |
Nesta
consulta temos uma cadeia de operadores de consulta. Cada operador funciona na
sequência fornecida pelo operador de consulta anterior.
Os operadores de consulta Where, OrderBy e Select são operadores de consulta padrão que resolvem para os métodos de extensão na classe classe Enumerable(namespace System.Linq).
O operador Where emite uma versão filtrada da sequencia de entrada;
O operador OrderBy emite uma versão ordenada de sua seqüência de entrada;
O método Select emite uma seqüência onde cada elemento de entrada é transformado com uma dada expressão lambda (x.Nome(), neste caso).
Observe que a entrada inicial, representada pela variável ingredientes, é do tipo IEnumerable<Ingrediente>, enquanto a seqüência de saída (representada pela variável consultaIngredientesComMaisCalorias) , é um tipo diferente; é um IEnumerable <string>.
Neste exemplo, a cadeia de operadores está trabalhando com uma seqüência de elementos ingredientes até o operador Select transformar cada elemento na sequência; cada objeto de ingrediente é transformado em uma string simples.
Essa transformação é chamada de projeção: Os elementos de entrada são projetados em elementos de saída transformados.
A expressão lambda fornecida ao operador de consulta Select decide o 'formato' dos elementos na sequência de saída necessário.
A expressão lambda x => x.Nome está dizendo para o operador Select que "para cada elemento ingrediente, emita um elemento de string com o valor do Nome da propriedade do Ingrediente de entrada."
Na segunda parte do artigo abordaremos o estilo de consulta LINQ Query Expression.
'E Jesus lhe disse: Vai, a tua fé te
salvou. E logo viu, e seguiu a Jesus pelo caminho. '
Marcos 10:52
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