LINQ: Criando consultas dinâmicas em C#

Olá pessoal, tudo bom?

O LINQ é uma excepcional ferramenta para consultas em fontes de dados de diferentes espécies, mas pode nos trazer complicações nos momentos onde precisamos personalizar a query de acordo com filtros que o usuário possa escolher na tela.

Por exemplo, suponha que você exiba em um grid a relação de contas bancárias cadastradas para um determinado cliente, porém o usuário pode escolher entre exibir TODAS as contas ou APENAS as que estão ativas em um dado momento.

filtro-linq

Nesse caso, teremos que “montar a query” LINQ dinamicamente, mas como?

Existe uma biblioteca denominada Dynamic LINQ (System.Linq.Dynamic) que nos permite informar critérios de consulta parecidos com SQL para a cláusula Where, OrderBy, etc, porém, para fazer uso desse recurso é necessário referencia-lo em nosso projeto. Vejamos:

Passo 1: Referenciar o namespace System.Linq.Dynamic em nosso projeto através do Package Manager Console do Visual Studio.

PM> Install-Package System.Linq.Dynamic

Passo 2: Montar a consulta dinamicamente. Exemplo:

...
using System.Linq.Dynamic;
...
...
public List<Conta> Contas(int idCedente, bool apenasAtivas)
{
  try
  {
    string criterio = string.Format("CedenteID = {0}", idCedente);
    if (apenasAtivas)
       criterio += " AND Ativa = 'S'";

    using (DadosEntities contexto = new DadosEntities(Helper.Util.ConnectionString))
    {
      return contexto.CedenteConta.Where(criterio).OrderBy(x => x.BancoID).ToList();
    }
  }
  catch
  {
    return null;
  }
}

Grande abraço,
Eduardo Henrique Rizo

[twitter-follow screen_name=’eduardorizo’ show_count=’yes’]

Publicado em ASP.NET, Entity Framework, LINQ Marcado com: , , , , , , , ,
2 comentários sobre “LINQ: Criando consultas dinâmicas em C#
  1. Muito bom, obrigado pelo dica!

    É possível fazer também utilizando o PredicateBuilder, conforme o link abaixo:

    http://www.albahari.com/nutshell/predicatebuilder.aspx

    Um abraço!

    • ehrizo disse:

      Olá, tudo bom?

      Não conheço o PredicateBuilder, mas vou tentar arrumar um tempinho para pesquisa e logo que consiga, te respondo.

      Abraços,
      Eduardo H. Rizo

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

*