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

Garanta sua matrícula hoje e ganhe + 2 meses grátis

Continue sua jornada tech com ainda mais tempo para aprender e evoluir

Quero aproveitar agora
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!