Artigo


Query Dinâmica - Parte Final

9/1/2010

Olá pessoal, esse é nosso último artigo da séria sobre query's dinâmicas, no primeiro apresentamos uma solução utilizando Lambda Expressions e já no anterior demonstramos como resolver o problema utilizar a biblioteca LinqKit que muito provavelmente devem ter notato uma diferença na complexidade de uma e outra.

Antes de mais nada, se não leu os artivos anteriores, para se familiarizar com o assunto que estamos falando, é só acessar os links abaixo:
http://www.devgoias.net/artigo_ler.aspx?ID=59
http://www.devgoias.net/artigo_ler.aspx?ID=62

A solução que vamos apresentar agora é distribuída em um pacote de exemplos para C#:  http://msdn.microsoft.com/en-us/vcsharp/bb894665.aspx ou em VB.Net: http://msdn.microsoft.com/en-us/vbasic/bb964686.aspx

Em ambos os pacotes você vai encontrar uma pasta chamada DynamicQuery que contém um exemplo de como utilizar esse pacote.

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 DynamicQuery.


    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);
   

               

            //construindo o filtro
            var
filtro
=
"";
          
            if
(true) //filtra nome (colocamos true para simplificar)           
                    filtro += "Nome.StartsWith(@0)";
              

            if (true) //filtra endereço (colocamos true para simplificar)           
                    filtro += filtro.Length > 0
                        ? "and Endereco.Contains(@1)"
                        : "Endereco.Contains(@1)";

              

            //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(filtro, "J", "ABC");

            Console.WriteLine(" - Usando Dynamic Query Library - ");

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


            Console.ReadLine();
       
        }
    }

Note que neste caso criamos uma string do filtro a ser aplicado indicando o local os parâmetros ('@0' e '@1'), depois no momento de criar a expressão linq passamos os valores para cada parâmetro.

Neste último artigo resolvi criar um vídeo para facilitar a apresentação do nosso assunto, espero que gostem:

 

Com isso finalizamos esta série demonstrando um pacote de exemplos fornecido pelo time da Microsoft, que também torna nossa tarefa mais simplificada, assim você pode optar pela opção que mais lhe agradar.

 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

Clovis Coli Junior
colijunior

.NETClovis Coli Junior

7/3/2010 18:47:23

Muito bom Marcelo, gostei.

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.