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<Cliente> com os clientes de código 1, 2, 4 e 6.

Grande abraço,
Eduardo Henrique Rizo

Anúncios

Coordenador de Internet da Universidade do Oeste Paulista (Unoeste) e professor universitário de disciplinas relacionadas ao desenvolvimento de sistemas para Web, gerenciamento de servidores, serviços e redes.

Marcado com: , , , , , , , , ,
Publicado em LINQ

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

Sorocaba e Região
Prestadora de serviços RIZZO GS - Sorocaba/SP

Serviços de limpeza, conservação, recepção, copa, portaria, vigia, zeladoria, jardim, elétrica, hidráulica, pintura, etc.

Contato: (15) 3357-4263 / (15) 3357-4502 - contato@rizzogs.com.br

Website: http://www.rizzogs.com.br

%d blogueiros gostam disto: