Usuário com melhor resposta
Clasula WHERE em LINQ to SQL - Como construtuir uma clasula Where, onde um ou mais parametros podem ser nulos?

Pergunta
-
Bom dia Pessoal
Estou trabalhando com uma aplicação que utiliza EF como método de acesso a banco. Estou com uma situação onde tenho uma tela de busca onde existem 4 filtros e nenhum dele é obrigatório, uma busca dinâmica onde pode ser passado de 1 a 4 parâmetros ou nenhum parâmetro. Como fazer isso com LINQ? Sei como tratar isso em sql que ficaria algo assim:
WHERE Livro.nomeLivro LIKE'%' + ISNULL(@NomeLivro, Livro.nomeLivro) + '%' AND Livro.palavraChave LIKE '%' + ISNULL(@PalavraChave, Livro.palavraChave) + '%' AND Autor.idAutor = ISNULL(@CodigoAutor, Autor.idAutor) AND Assunto.idAssunto = ISNULL(@CodigoAssunto, Assunto.idAssunto)
Respostas
-
Paula, realmente é difícil identificar, tente alterar o seguinte para ver se ajuda a identificar/resolver:
Ao invés de tipar a variável ListaServico da forma que está fazendo (com IEnumerable), apenas defina a variável por "var". Assim:
var ListaServico = from ....
Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!
André Secco
Microsoft MSP & MSDN Tech Advisor
Blog: http://andresecco.com.br
GitHub: http://github.com/andreluizsecco
Twitter: @andre_secco- Marcado como Resposta William John Adam TrindadeModerator sexta-feira, 16 de setembro de 2016 19:46
Todas as Respostas
-
Olá Paula,
Se quiseres manter a lógica que usa nesse seu SQL, poderia fazer assim:
string nomeLivro = string.Empty; string palavraChave = string.Empty; int codigoAutor = 0; int codigoAssunto = 0; var result = db.Livros.Where(x => (x.NomeLivro.Contains(nomeLivro) || string.IsNullOrEmpty(nomeLivro)) && (x.PalavraChave.Contains(palavraChave) || string.IsNullOrEmpty(palavraChave)) && (x.Autor.IdAutor == codigoAutor) || codigoAutor == 0) && (x.Assunto.IdAssunto == codigoAssunto) || codigoAssunto == 0))
OBS: Adapte como for conveniente, baseado no seu modelo.
Valeu!
Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!
André Secco
Microsoft MSP & MSDN Tech Advisor
Blog: http://andresecco.com.br
GitHub: http://github.com/andreluizsecco
Twitter: @andre_secco
- Editado André SeccoMVP sexta-feira, 16 de setembro de 2016 13:30
-
O que eu fiz em um caso parecido com o seu foi extender o metodo where, criando um WhereIf:
public static IQueryable<TSource> WhereIf<TSource>( this IQueryable<TSource> source, bool condition, Expression<Func<TSource, bool>> predicate) { if (condition) return source.Where(predicate); else return source; }
depois fica facil:
Livro.WhereIf(pNomeLivro!=null, w=>w.nomeLivro.Contains(pNomeLivro)).WhereIf(pPalavraChave!=null, w=>w.palavraChave.Contains(pPalavraChave))
att
William John Adam Trindade
Analyste-programmeur
----------------------------------------------------------
-
-
Paula, realmente é difícil identificar, tente alterar o seguinte para ver se ajuda a identificar/resolver:
Ao invés de tipar a variável ListaServico da forma que está fazendo (com IEnumerable), apenas defina a variável por "var". Assim:
var ListaServico = from ....
Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!
André Secco
Microsoft MSP & MSDN Tech Advisor
Blog: http://andresecco.com.br
GitHub: http://github.com/andreluizsecco
Twitter: @andre_secco- Marcado como Resposta William John Adam TrindadeModerator sexta-feira, 16 de setembro de 2016 19:46
-