none
Clasula WHERE em LINQ to SQL - Como construtuir uma clasula Where, onde um ou mais parametros podem ser nulos? RRS feed

  • 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)

    sexta-feira, 16 de setembro de 2016 13:19

Respostas

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



    sexta-feira, 16 de setembro de 2016 13:29
  • 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
    ----------------------------------------------------------

    sexta-feira, 16 de setembro de 2016 13:35
    Moderador
  • Olá André,

    Tentei fazer algo parecido com isso, mas esta dando erro de Referência de objeto não definida para uma instância de um objeto. Não estou conseguindo identificar.Veja.

    sexta-feira, 16 de setembro de 2016 18:19
  • 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

    sexta-feira, 16 de setembro de 2016 19:17
  • André,

    Consegui descobrir. Tinha um objeto null e eu estava tentando pegar uma propriedade nele. Corrigi e o filtro funcionou. Muito obrigada por enquanto.

    sexta-feira, 16 de setembro de 2016 19:43