Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Consulta Dinâmica

Tenho um tela com vários campos e dependendo de quais forem preenchidos ele cria a consulta. Exemplo: tenho o campo nome e sobre-nome, caso ele passe os dois a pesquisa vai ser feita em cima dos dois campos, caso passe só um vai ser realizada em cima de um campo só. Como faço isso? Muito obrigado

2 respostas
solução!

Olá, João Paulo!

Você pode ou construir uma query só com todas as condições possíveis, ou contruir aos poucos para deixá-la mais enxuta.

Abordagem 1: Construir uma única query para todas as situações

        void ConsultaClientes(string nome, string endereco, DateTime? dataNascimento)
        {

            var query
            = from cli in Clientes
            where (cli.Nome == nome || nome == null)
            && (cli.Endereco == endereco || endereco == null)
            && (cli.DataNascimento == dataNascimento || dataNascimento == null)
            select new
            {
                cli.Nome,
                cli.Endereco,
                cli.DataNascimento
            };

        }

Abordagem 2: Construir uma query inicial e incrementá-la progressivamente apenas com os parâmetros preenchidos. Perceba como a query inicial servirá como origem para as queries subsequentes!

        void ConsultaClientes(string nome, string endereco, DateTime? dataNascimento)
        {

            var query = 
            from cli in Clientes
            select new
            {
                cli.Nome,
                cli.Endereco,
                cli.DataNascimento
            };

            if (!string.IsNulOrEmpty(nome))
            {
                query = 
                from q in query
                where cli.Nome == nome
            }

            if (!string.IsNulOrEmpty(endereco))
            {
                query = 
                from q in query
                where cli.Endereco == endereco
            }

            if (dataNascimento.HasValue)
            {
                query = 
                from q in query
                where cli.DataNascimento == dataNascimento
            }

        }

Qual a abordagem melhor? Depende. A primeira exige menos linhas de código, porém a segunda é mais enxuta, e oferece a vantagem de permitir refatoração, pois podemos extrair trechos de código para outros métodos. Quando usamos o LINQ, podemos obter o mesmo resultado programando as consultas de formas diferentes. Por via das dúvidas, eu recomendo que você utilize o aplicativo LINQPad (http://www.linqpad.net/), onde você pode "brincar" com as consultas e comparar os resultados delas (tanto ver as consultas SQL geradas quanto comparar o tempo de resposta do banco de dados).

Obrigado por prestigiar nosso curso!

Valeu, ajudou bastante. Muito obrigado!