none
Tela com filtro dinamico para pesquisar no servidor RRS feed

  • 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)
    terça-feira, 27 de abril de 2010 14:29

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?
    quarta-feira, 28 de abril de 2010 12:18
  • 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?
    quinta-feira, 29 de abril de 2010 14:13

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?
    quarta-feira, 28 de abril de 2010 12:18
  • 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)
    quarta-feira, 28 de abril de 2010 13:11
  • 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?
    quinta-feira, 29 de abril de 2010 14:13
  • Valeu Danimar, se tiver informçoes maiores por favor poste aqui! hehe

    abraços


    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand" (Martin Fowler)
    quinta-feira, 29 de abril de 2010 16:03
  • Mas se vc fizer isso que o Danimar disse  não vai acabar enchendo de if´s ???

    ou eu que nao entendi ???

    como seria esse objeto ?

    quinta-feira, 29 de abril de 2010 17:16
  • 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?
    quinta-feira, 29 de abril de 2010 17:40
  • 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?
    quinta-feira, 29 de abril de 2010 19:10
  • 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 ...

    quinta-feira, 29 de abril de 2010 19:15
  • 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?
    quinta-feira, 29 de abril de 2010 20:15
  • 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
    segunda-feira, 10 de maio de 2010 03:25