Usuário com melhor resposta
Tela com filtro dinamico para pesquisar no servidor

Pergunta
-
Pessoal, tenho uma tela onde os filtros podem ser dinamicos. O usuário seleciona a propriedade, o tipo da comparação (maior, menor, igual, etc) e o valor que deseja. Um campo pode ter mais de um filtro (maior que esse e menor que aquele) e diversos tipos de valores.
Como posso fazer isso? Imagine que tenho a classe Pessoa, com nome, cpf, data de nascimento, etc.
Quando entro na tela de consulta, a pessoa escolhe nome começa com Leandro e data de nascimento entre 01/01/2000 até 31/12/2000. Quer todos os Leandros que nasceram em 2000. Mas como vou fazer isso passar via serviço? Nao posso criar um Get pra cada situação. Pensei em criar um objeto genérico para transmitir isso com métodos que adicionam o campo (.add("Nome","LIKE", "Leandro") e .add("datanasc","<","x") e .add("datanasc",">","Y")) mas isso seria dar inteligencia de banco para tela.Como faço para resolver esse problema sem ferir os padrões de desenvolvimento?
ps: utilizo WPF para telas, com MVVM e WCF para serviço de comunicação
"Any fool can write code that a computer can understand. Good programmers write code that humans can understand" (Martin Fowler)
Respostas
-
Cria um objeto de consulta.
Uma classe com as consultas que vc quer efetuar, vc seta ela com os valores, ai na sua camada de acesso a dados vc verifica quais propriedades do objeto foram setadas e faz a consulta com base naquele objeto.
Quem sabe um dia os DataSets se extinguirão?- Marcado como Resposta LeandrodeMelloFagundes quinta-feira, 29 de abril de 2010 16:02
-
Isso mesmo.
Nunca cheguei a pesquisar se isso é um padrão, ou tem um nome.
Eu pensei nessa solução, baseado em consultas feitas em bancos do tipo OO, como o DB4O pois nele se vc quiser fazer uma consulta de objeto, vc seta as propriedades q vc quer e ele retorna os objetos que correspondem.
Vou pesquisar sobre isso.
Quem sabe um dia os DataSets se extinguirão?- Marcado como Resposta LeandrodeMelloFagundes quinta-feira, 29 de abril de 2010 16:02
Todas as Respostas
-
Cria um objeto de consulta.
Uma classe com as consultas que vc quer efetuar, vc seta ela com os valores, ai na sua camada de acesso a dados vc verifica quais propriedades do objeto foram setadas e faz a consulta com base naquele objeto.
Quem sabe um dia os DataSets se extinguirão?- Marcado como Resposta LeandrodeMelloFagundes quinta-feira, 29 de abril de 2010 16:02
-
Danimar,
sua idéia é ter por exemplo um objeto PESSOACONSULTA? se tiver a propriedade NOME ele vai filtrar por nome, se eu setar valor para a propriedade data, ele filtra por data e assim vai?
É interessante, tem alguns bloqueios mas talvez seja o melhor mesmo.
Isso é algum padrão? como seria o nome desse objeto? Objeto de Consulta? SearchObject? (só pra ter como exemplo se isso é uma pratica ou não)
"Any fool can write code that a computer can understand. Good programmers write code that humans can understand" (Martin Fowler) -
Isso mesmo.
Nunca cheguei a pesquisar se isso é um padrão, ou tem um nome.
Eu pensei nessa solução, baseado em consultas feitas em bancos do tipo OO, como o DB4O pois nele se vc quiser fazer uma consulta de objeto, vc seta as propriedades q vc quer e ele retorna os objetos que correspondem.
Vou pesquisar sobre isso.
Quem sabe um dia os DataSets se extinguirão?- Marcado como Resposta LeandrodeMelloFagundes quinta-feira, 29 de abril de 2010 16:02
-
-
-
Não sei exatamente como criar um componente que poderia fazer isto.
Mas com Hibernate é possível fazer isso sim, sem nenhum if, o nome disso é Query By Example.
Neste link tem um exemplo disso:
http://docs.jboss.org/hibernate/core/3.3/reference/en/html/querycriteria.html
Será que isso funciona no NHibernate? vou testar.
Cat cat = new Cat();
cat.setSex('F');
cat.setColor(Color.BLACK);
List results = session.createCriteria(Cat.class)
.add( Example.create(cat) )
.list();
Quem sabe um dia os DataSets se extinguirão? -
Só para constar consegui fazer a consulta com NHibernate.
public IList<PhotoBook.Model.Entities.Categoria> BuscaCategoriaByExample(PhotoBook.Model.Entities.Categoria categoria) { using (ISession session = this.SessionNHiBernate.OpenSession()) { ICriteria query = session.CreateCriteria<PhotoBook.Model.Entities.Categoria>(); query.Add(Example.Create(categoria)); return query.List<PhotoBook.Model.Entities.Categoria>(); } }
Quem sabe um dia os DataSets se extinguirão? -
Mas ele só ia poder dar .add se o filtro for selecionado, entao ele ia cair nos if´s de novo, certo ?
ele não pode dar um .add em um critério sem ver se ele foi selecionado
creio que um método para criar os critérios seria bacana .. pra nao encher de if´s ...
-
Mas ele só ia poder dar .add se o filtro for selecionado, entao ele ia cair nos if´s de novo, certo ?
ele não pode dar um .add em um critério sem ver se ele foi selecionado
creio que um método para criar os critérios seria bacana .. pra nao encher de if´s ...
Na interface não faz mal vc criar os if's pois vc está lidando apenas com o objeto de Dominio, não esta efetuando nenhuma regra de negócio.Mesmo assim, teria jeito usando reflection para preencher as propriedades do objeto e nas propriedades dos componentes de formulario colocar o nome igual ao da propriedade da classe. Enfim seria bem mais dificil que usar um if.
Quem sabe um dia os DataSets se extinguirão? -
Olá Chan,
Achei esse artigo bem interessante, de uma olhada e veja se não atende de alguma forma com o que precisa.
http://www.alexandreminato.com.br/post/2010/04/25/Expressoes-lambdas-%28Dinamicas%29.aspx
Abraço, Espero ter ajudado. Caso sim, marque-a como tal.- Sugerido como Resposta Iter Lubnon segunda-feira, 10 de maio de 2010 03:25