Unindo expressions para gerar uma query codicional - C# e Entity Framework

Em um projeto no qual estou atualmente envolvido existe uma página de busca onde o cliente pode buscar pelo endereço (rua, estado, cidade, bairro...),  então havia a necessidade de gerar uma query apenas com os campos que forem preenchidos. Ex.: O cliente preenche apenas pela cidade logo eu devo trazer todos daquela cidade ignorando o bairro. Depois de "quebrar a cabeça" por um tempo cheguei a solução que foi detalhar abaixo:

Unindo a expressions

Temos abaixo as duas expressions com as duas consultas que desejamos unir para fazer apenas uma busca na base de dados:


Expression<Func<Endereco, bool>> expAntiga = p => (p.Cidade == "Caruaru");

Expression<Func<Endereco, bool>> expNova = p => (p.Bairro=="Petrópolis");

Na primeira é uma busca pela cidade e a busca deve considerar também o bairro.

Para fazer a junção eu crio uma nova expression e chamo o método AndAlso passando o paramêtro Body das expressions:

var expUnida = Expression.Lambda<Func<Endereco, bool>>(
                    Expression.AndAlso(expAntiga.Body, expNova.Body), expNova.Parameters);

Muito simples não é ?!

até a próxima ;)

0 comentários:

Postar um comentário