none
Consulta SQL utilizando Lambda RRS feed

  • Pergunta

  • Boa madrugada galera..

    estou fazendo uma consulta utilizando expressoes Lambda... 

    basicamente o que eu gostaria é que cada palavra digitado no campo textbox fosse verificado se contem todas as palavras nos campos de pesquisa separadamente.

    exemplo:
    digitando AV CARLOS DE ANDRADE..
    deve retornar todos os registros que contem as palavras "AV", "CARLOS", "DE" e "ANDRADE"... 
    e nao apenas o nome = "AV CARLOS DE ANDRADE". Nesse caso, poderia retornar:

    • AV CARLOS DE ANDRADE
    • AVENINA CARLOS DE ANDRADE
    • CARLOS ANDRADE

    entao consegui fazer isso utilizando o Contains, como ele só pode receber string... fiz assim:

    string[] palavras; palavras = txtPesquisar.Text.Split(' '); predicate = ( c => c.CamposDePesquisa.Contains(palavras[0]) && c.CamposDePesquisa.Contains(palavras[1]) && c.CamposDePesquisa.Contains(palavras[2]) && c.CamposDePesquisa.Contains(palavras[3]) );

    funciona, porem, gostaria que essa consulta fosse mais dinamica.. e nao fixa

    nesse exemplo acima, ele pesquisa 4 palavras.. mas poderia ser 10 15 palavras.

    como poderia fazer nesse caso?

    domingo, 3 de julho de 2016 06:15

Respostas

Todas as Respostas

  • tentei assim...

    foreach (var item in palavras)
    {
           predicate = (c => c.CamposDePesquisa.Contains(item));
    }

    até que funcionou.. em partes!

    assim a consulta ficou com condicao || ao invés de &&
    e eu gostaria que tivesse TODAS as palavras e não apenas UMA das palavras

    domingo, 3 de julho de 2016 07:18
  • Olá Michaeell,

    Você teria que implementar algo do tipo:

    predicate = (c => c.CamposDePesquisa.Contains(item));

    ParameterExpression p = predicate.Parameters[0];

    Expression body = Expression.AndAlso(lambda.Body, predicate.Body);

    lambda = Expression.Lambda<Func<T, bool>>(body, p);

    Mais ou menos, esse código faz o seguinte, pega o predicate, extrai o parâmetro sendo usado (neste caso 'c') e o guarda na variável 'p'. Logo concateno o predicate com uma variável lambda que uso para concatenar e guardo isso na variável "body" usando AndAlso.

    Todas as expressions concatenadas devem usar o mesmo parâmetro de lambda se não o .net vai lançar um erro de variável não definida.

    Eu sugiro a você dar uma olhada no linkit, acho que seria mais fácil para conseguir o que você quer.

    terça-feira, 5 de julho de 2016 12:49
  • Obrigado pela reposta Pablo,

    mas infelizmente não consegui.

    ocorre erro em Parameters, não encontra o método e não há nenhum parecido.

    ocorre erro também em lambda e Body

    =(

    terça-feira, 5 de julho de 2016 14:24
  • Olá Michaeell,

    Então, eu te aconselho usar o Linqkit. Tem como instalar pelo Nuget. Esse componente vai te permitir montar predicados dinamicamente sem muita complicação.

    Olha aqui: http://www.albahari.com/nutshell/predicatebuilder.aspx

    • Marcado como Resposta DevMaicon quarta-feira, 6 de julho de 2016 02:04
    terça-feira, 5 de julho de 2016 14:48
  • cara.. muito obrigado

    seguido esse site consegui finalmente fazer a consulta como queria

    e muito mais que isso até.


    Valeww

    quarta-feira, 6 de julho de 2016 00:51
  • De nada Michaeell, estamos ai qualquer coisa.
    quarta-feira, 6 de julho de 2016 12:17
  • Michaeell ja tentou com StartsWith && EndsWith? 

    sexta-feira, 8 de julho de 2016 10:34
  • nesse caso conseguiria pegar apenas ou inicio ou final 

    com contains ele procura em todo o campo

    utilizando Linqkit além de funcionar com várias palavras, utilizando operador AND ele funciona independente se é letra em maiusculo ou minusculo.. e também não importa a ordem das palavras.

    dessa forma consegui criar um campo gerico de buscas..
    o usuario apenas digita no campo txtPesquisar.Text o que ele precisa...
    e o sistema procura nos campos (codigo, nome, endereco, numero, complemento, referencia, bairro, cidade, estado, cnpj, rg ) tudo ao mesmo tempo.

    ótimo para busca rapida de cliente, sem precisar estar escolhendo o campo de filtro

    sexta-feira, 8 de julho de 2016 12:40
  • show hein! vou testar.
    fui tentar ajudar acabei aprendendo, hehe valew maninho
    sexta-feira, 8 de julho de 2016 13:54