Usuário com melhor resposta
Consulta SQL utilizando Lambda

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?
Respostas
-
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
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 -
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.
-
-
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
-
-
-
-
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
-