none
Pesquisa Incremental Linq to sql RRS feed

  • Pergunta

  •  

    Boa tarde pessoal.

    Estou explorando o Linq To SQL e já percebi que os selects dinamicos não são tão simples assim de se fazer.

    Baixei o DynamicLinq para tentar resolver um problema mas provavelmente não consegui encontrar a solução. O caso é o seguinte: Possuo uma tabela com 3 campos para dar um exemplo ficticio: Aluno_Codigo, Aluno_Nome, Aluno_Curso.

    Gostaria de disparar um select contra menu banco sql para que a cada caracter digitado pelo usuário retorne as linhas com a informação filtradas. Ex:

     

    var query = from alunos in db.Alunos

    where alunos.Aluno_Nome.StartWith("P")

    select alunos;

     

    Até aqui, sem problemas. Porem, quero dar a possibilidade para o usuário escolher por qual campo a procura se derá. Nesse caso ele poderia fazer a pesquisa tanto pelo nome do aluno quanto pelo curso do aluno. Ex.:

     

    var query = from alunos in db.Alunos

    where alunos.Aluno_Curso.StartWith("Excel")

    select alunos;

     

    Ai vai minha dúvida: Como fazer para que na clausula where eu monte uma expression lambda dinamica de modo que o nome do campo mapeado possa ser trocado facilmente por outro?

     

    Obrigado.

     

     

     

    sexta-feira, 23 de janeiro de 2009 16:01

Todas as Respostas

  • ao meu ver... o mais correto seria voce implementar um metodo de pesquisa na sua entidade Aluno

     

    Code Snippet

    partial class Aluno {

         public static Aluno ConsultaDinamica(string campo, string valor) {

              switch (campo) {

        case "Aluno_Nome":

    return db.Alunos.SingleOrDefault(query => query.Aluno_Nome.StartWith(valor));

        case "Aluno_Curso":

    return db.Alunos.SingleOrDefault(query => query.Aluno_Curso.StartWith(valor));

        default:

         throw new Exception("Campo inválido");

    }

         }

    }

     

     

    dessa forma pra vc chamar a sua consulta seria so

     

    var aluno = Aluno.ConsultaDinamica("Aluno_Nome", "P");

     

    sexta-feira, 23 de janeiro de 2009 22:07
    Moderador
  • sexta-feira, 23 de janeiro de 2009 22:10
    Moderador
  • Bom dia Rui. Obrigado pela ajuda.

    Realmente se eu fizer um método consigo resolver ( tanto que é exatamente isso que faço hoje.). Porem não é pratico. No exemplo que dei para tentar exemplificar o caso foi algo figurado, pois na realidade tenho vários objetos que podem conter vários campos que podem ser usados para pesquisa pelo usuário que são disponibilizados na UI dinamicamente. O usuário seleciona o campo através de um combobox e faz a pesquisa. Portanto, se um novo campo for criado em meu banco de dados e uma nova propriedade no objeto, esse já fica disponivel para o usuário fazer a pesquisa e o que eu queria era passa-lo como parametro para meu método de seleção para que no momento da construção da query usando linq a clausula where possa ser montada dinamicamente de acordo com o campo que seria usado.

    Já com relação ao ExecuteQuery não sei se interpretei errado pois ainda estou explorando o linq, mas ao meu ponto de ver usando esse método eu acabo pertendo o mapeamente do banco relacional, tendo que injetar os comando sql como um texto e as mesmas não serem compiladas em tempo de projeto para pegar eventuais problemas, fugindo um pouco do que o linq oferece de melhor.

    Espero que tenha conseguido expor o problema... Qualquer coisa, posso tentar postar um pedaço do meu código para ver se ajuda.

    Qualquer dúvida estou a disposição.

    Obrigado novamente.

     

     

     

    segunda-feira, 26 de janeiro de 2009 12:41
  • Entao... sem perder o mapeamento nao teria como mesmo...

     

    agora se vc quiser carregar um combobox dinamicamente com os propriedades da sua entidade... pode usar o metodo GetProperties do System.Reflection para isso....

     

    Porem se vc incluir um campo novo no banco, vai ter q colocar o mesmo no mapeamente... e adicionar a clausula do case no metodo q expus para ele....

     

    Parece pior assim... mas nem tanto... uma vez que criar "querie dinamicas" podem acarretar em serios erros no futuro, principalmente envolvendo versoes nao corretamente atualizadas, que podes se tornar dificeis de se corrigir....

     

    e a ideia do Linq, e transformar a camada de banco de dados q eh relacional de forma a ser manipulada em um sistema orintedado a objeto, entao esse tipo de consulta pode funcionar bem na metodologia relacional... mas foge do conceito de Oritentacao a Objeto...

     

    Mas... qq duvida tamo ai... da uma olhada no GetProperties e diz se te ajuda

    segunda-feira, 26 de janeiro de 2009 15:06
    Moderador
  • Então Rui... o combo eu já estava conseguindo fazer e justamente usando Reflection. A questão era a criação de expressões Lambda dinamicas mesmo. Bom, vou continuar pesquisando outras formas. Qualquer novidade posto aqui!

    Valeu!

     

    segunda-feira, 26 de janeiro de 2009 15:17
  • Olá,

    uma outra forma de fazer query incremental (em que o usuário pode preencher um ou mais parâmetros) é usar a própria query como origem de outra:

    var query = from a in db.Alunos
    where ...
    select ....;

    if ....
    {
    query = from a in query
    where ...
    select ...;
    }

     


    Luiz Cláudio Cosenza Vieira da Rocha - http://msmvps.com/blogs/officedev - IT Lab www.itlab.com.br
    segunda-feira, 9 de fevereiro de 2009 03:06