Artigo


Query Dinâmica - Parte II

20/12/2009

Olá pessoal, em nosso artigo anterior falamos de um "problema" que temos ao escrever query's dinâmicas com Linq, naquele momento apresentamos uma solução utilizando Lambda Expressions, no entando está longe de ser o ideal para resolver nosso problema pois se demonstrou ser uma solução muito complexa.

Antes de mais nada dê uma lida no artigo anterior para se familiarizar do assunto que estamos falando, é só acessar o link abaixo:
http://www.devgoias.net/artigo_ler.aspx?ID=59

A solução que vamos apresentar agora, fazemos uso da biblioteca fornecida por Joseph Albahari que você pode encontrar no link: http://www.albahari.com/nutshell/linqkit.aspx

Em nosso exemplo precisamos filtrar em uma consulta numa determinada lista de pessoas, onde o nome da pessoa começa com 'J' e/ou contenha no endereço a sigla 'ABC' conforme o que for indicado pelo usuário.

Então vamos ver como fica agora o código utilizando a biblioteca 'LinqKit'.

 


    class
Program
   
{
        static void Main()
        {
            var listaPessoas = new List
                 {
                     new Pessoa{Nome = "Jose da silva", Endereco = "Rua ABC", CPF = "1"},
                     new Pessoa{Nome = "Roberto da silva", Endereco = "Rua DEF", CPF = "2"},
                     new Pessoa{Nome = "João da silva", Endereco = "Rua ABC", CPF = "3"},
                     new Pessoa{Nome = "Joaquim da silva", Endereco = "Rua DEF", CPF = "4"},

                 };

            var pessoasJ = from p in listaPessoas
                                 where p.Nome.StartsWith("J") && p.Endereco.Contains("ABC")
                                 select p;

            Console.WriteLine(" - Usando Query expression fixa - ");

            foreach (var pessoa in pessoasJ)
                Console.WriteLine(pessoa.Nome + " - " + pessoa.Endereco);
   

               

            //iniciamos PredicateBuilder que vamos utilizar para montar o filtro
            var
predicado
= PredicateBuilder.True
();
          
            if
(true) //filtra nome (colocamos true para simplificar)
            {
                    predicado = predicado.And(p => p.Nome.StartsWith("J"));
               }

            if (true) //filtra endereço (colocamos true para simplificar)
            {
                    predicado = predicado.And(p => p.Endereco.Contains("ABC"));
               }

            //executando o filtro
            //devemos converter a lista para um IQueryable
            //antes de chamar o filtro (where) que neste caso
            //deve ser por Lambda
           
            var consultaPessoa = listaPessoas.AsQueryable().Where(predicado);

            Console.WriteLine(" - Usando LinqKit - ");

            foreach (var pessoa in pessoasJ)
                Console.WriteLine(pessoa.Nome + " - " + pessoa.Endereco);


            Console.ReadLine();
       
        }
    }

 

 

Acredito que agora ficou mais simples para se entender e também é algo que podemos considerar o uso em nossas aplicações. Ainda temos outra opção com o uso de uma biblioteca fornecida pelo time da Microsoft que vou apresentar na última parte desta série.

Comentem aí o que estão achando. Até a próxima.



Marcelo Paiva - marcelo.paiva@devgoias.net

Analista de Sistemas, com 16 anos de experiência em engenharia de software, MCP e IBM CLP. Possui conhecimentos em ferramentas de workflow, infra-estrutura de servidores e redes. Trabalha com o .Net desde a versão 1.0 e atualmente desenvolve projetos na Softprime Soluções, com o Framework 3.5 SP1 utilizando tecnologias ADO Data Services e Linq to Entities.
blog: marcelosoftprime.spaces.live.com



| | Mais


Comentários

Qual a sua opinião?
Faça o login no topo do site ou cadastre-se rapidamente.



2003-2009 DevGoiás.NET. Todos os direitos reservados.