Como implementar uma consulta “not in” usando LINQ

linq-logoOlá pessoal, tudo bom?

Segue um post rápido demonstrando como fazer uma seleção “not in” usando o LINQ.

Para o exemplo criei uma classe Cliente com os atributos Código e Nome. Derivando dessa classe tenho uma lista com todos os clientes cadastrados e outra com clientes negativados, sendo que meu objetivo, é produzir uma terceira lista apenas com o clientes que não estão negativados, ou seja, os “ficha limpa” 🙂 Vamos aos fontes:

Classe Cliente.cs


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ExemploLinq
{
  public class Cliente
  {
    private int _codigo;
    public int Codigo
    {
      get { return _codigo; }
      set { _codigo = value; }
    }

    private string _nome;
    public string Nome
    {
      get { return _nome; }
      set { _nome = value; }
    }
  }
}

Classe ClienteControladora.cs


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ExemploLinq
{
  public class ClienteControladora
  {
    public ClienteControladora() { }

    /// <summary>
    /// Retorna uma lista com todos os clientes cadastrados
    /// </summary>
    /// <returns></returns>
    public List<Cliente> ObterClientes()
    {
      //Monta uma lista ficticia com todos os clientes cadastrados
      List<Cliente> todosClientes = new List<Cliente>();
      todosClientes.Add(new Cliente { Codigo = 1, Nome = "Cliente 1" });
      todosClientes.Add(new Cliente { Codigo = 2, Nome = "Cliente 2" });
      todosClientes.Add(new Cliente { Codigo = 3, Nome = "Cliente 3" });
      todosClientes.Add(new Cliente { Codigo = 4, Nome = "Cliente 4" });
      todosClientes.Add(new Cliente { Codigo = 5, Nome = "Cliente 5" });
      todosClientes.Add(new Cliente { Codigo = 6, Nome = "Cliente 6" });

      return todosClientes;
    }

    /// <summary>
    /// Retorna uma lista com todos os clientes negativados
    /// </summary>
    /// <returns></returns>
    public List<Cliente> ObterClientesNegativados()
    {
      //Monta uma lista ficticia com todos os clientes negativados
      List<Cliente> negativadosClientes = new List<Cliente>();
      negativadosClientes.Add(new Cliente { Codigo = 3, Nome = "Cliente 3" });
      negativadosClientes.Add(new Cliente { Codigo = 5, Nome = "Cliente 5" });

      return negativadosClientes;
    }

    /// <summary>
    /// Retorna uma lista com todos os clientes Ficha Limpa, ou seja, os não negativados
    /// </summary>
    /// <returns></returns>
    public List<Cliente> ObterClientesFichaLimpa()
    {
      //Exemplo de instrução "not in" do select usando Linq
      var dados = (from c1 in ObterClientes()
                   where !(from c2 in ObterClientesNegativados()
                           select c2.Codigo).Contains(c1.Codigo)
                   select c1).ToList();
      return dados;
    }
  }
}

Repare que na classe ClienteControladora há um método chamado ObterClientesFichaLimpa() que retorna um List com os clientes de código 1, 2, 4 e 6.

Grande abraço,
Eduardo Henrique Rizo

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

Deixe um comentário