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!