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.