Início > C#, Dicas / Tips > Queries LINQ deferidas

Queries LINQ deferidas

No post Métodos de Extensão LINQ mais utilizados demonstrei métodos linq mais comuns quando se está desenvolvendo consultas LINQ.

Agora explico a diferença de métodos deferidos e métodos não-deferidos. Essa variação se refere a forma com que os métodos de uma query LINQ são executados. Uma query que contém somente métodos deferidos não executada enquanto não for executado um método não-deferido tipo: ToList(), ToArray() etc.

Continue lendo…
Exemplo:

using System; 
using System.Linq; 

class Produto
{
    public string Descricao {get;set;}
    public string Categoria {get;set;}
    public decimal Preco {get;set;}
}
 
class Program { 
    static void Main(string[] args) { 
 
        Produto[] produtos = {             
            new Produto {Descricao= "Detergente", Categoria = "Limpeza", Preco = 4.5M}, 
            new Produto {Descricao= "Água Sanitária", Categoria = "Limpeza", Preco = 5.2M}, 
            new Produto {Descricao= "Arroz", Categoria = "Alimentos", Preco = 10.50M}, 
            new Produto {Descricao= "Feijão", Categoria = "Alimentos", Preco = 3.45M} 
        }; 
 
        var resultados = produtos 
                        .OrderByDescending(e => e.Preco) 
                        .Take(3) 
                        .Select(e => new { e.Descricao, e.Preco }); 
 
        produtos[2] = new Produto { Descricao= "Laranja", Preco= 79.50M }; 
 
             
        foreach (var p in resultados) { 
            Console.WriteLine("Produto: {0}, Valor: {1}", p.Descricao, p.Preco); 
        } 
    } 
}

Criei um array de Produtos, e defini que a variável resultado vai receber o resultado de uma consulta linq, que pega os 3 primeiros resultados de produtos, ordenados por preço, e projeta as propriedades Descrição e Preço criando um objeto com uma classe anônima.

Depois da query ser utilizada, alteramos um dos objetos no array de Produtos e por fim enumeramos o resultado quando invocamos o foreach.

O resultado é o seguinte:

Descrição: Laranja Preço: 79,50
Descrição: Arroz Preço: 10,50
Descrição: Água Sanitária Preço: 5,20

Você pode perceber que a query não é executada até que o resultado seja enumerado, pois o produto que alteramos após ter montado a query também entrou na lista de resultados. Mas se acrescentarmos na estrutura da query um método não deferido, a query é executada instantaneamente.

        var resultados = produtos 
                        .OrderByDescending(e => e.Preco) 
                        .Take(3) 
                        .Select(e => new { e.Descricao, e.Preco }).ToList();

Acrescentei .ToList() ao final da instrução.

O resultado é o seguinte:

Descrição: Arroz Preço: 10,50
Descrição: Água Sanitária Preço: 5,20
Descrição: Detergente Preço: 4,50

Percebe-se então que o produto “Laranja” que foi adicionado após a definição da query, não aparece na listagem, pois um método não-deferido forçou a execução imediata da query.

Enfim, prestar atenção nesse detalhe de consultas LINQ pode te evitar bugs durante o desenvolvimento.

Baseado no Livro: Appress Asp.NET MVC – Chapter 5 – Pg. 107

Anúncios
  1. Nenhum comentário ainda.
  1. No trackbacks yet.

Deixar uma Anotação

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

dotnettips.wordpress.com/

Helping Programmers Since 1994

Viagem e Voo

Dicas para viagens, férias e voos nacionais e internacionais

Ivan Guimarães Meirelles

Analista Desenvolvedor

Void Podcast

Vazio e sem retorno de valor

Elemar DEV

Negócios, tecnologia e desenvolvimento

2,000 Things You Should Know About WPF

Everything a WPF Developer Needs to Know, in Bite-Sized Chunks

blog

so long

Fernando Franzini Blog

Engenharia de Software e Arquitetura Ágil

Gabriel RB.net

Blog técnico, com dicas, códigos, novidades e problemas do dia-a-dia programando.

Alexandre Valente's Blog

Experiências em tecnologia e assuntos diversos

%d blogueiros gostam disto: