sexta-feira, 26 de abril de 2013

LINQ to SQL - Inner Join e Left Join


Fazer Inner Join e Left Join utilizando LINQ é muito simples.

Eu tenho a seguinte estrutura de banco de dados:

Dados ara a tabela TipoAnimal:

  • Canino
  • Felino
Dados para a Tabela Cliente:
  • Celso Zequim 
  • Ana Paula
para a tabela Animal eu inseri um registro, dizendo que o Celso Zequim possui um Animal do tipo Canino com o nome de Babalu.


Para realizar um consulta no SQL Server para trazer os Todos os clientes e seus respectivos animais, ficaria dessa maneira:

select Cliente.Nome, Animal.Nome as Animal, TipoAnimal.Nome as Tipo from Cliente
inner join Animal on animal.idcliente = cliente.id
inner join TipoAnimal on Animal.idTipoAnimal = TipoAnimal.id


Para realizar essa query no LINQ teriamos:

var Resultado = from _C in bd.Clientes
join _A in bd.Animals on _C.id equals _A.idCliente
join _T in bd.TipoAnimals on _A.idTipoAnimal equals _T.id      
select new
{
         Nome = _C.nome,
         Animal = _A.nome,
         Tipo = _T.nome
};
Se eu quiser trazer todos os clientes, independente se eles tem animais ou não, teremos a seguinte query, com Left Join:

select Cliente.Nome, Animal.Nome as Animal, TipoAnimal.Nome as Tipo from Cliente
Left join Animal on animal.idcliente = cliente.id
Left join TipoAnimal on Animal.idTipoAnimal = TipoAnimal.id



Já no LINQ teríamos:

  var Resultado = from _C in bd.Clientes
join _A in bd.Animals on _C.id equals _A.idCliente into _a
from _A in   _a.DefaultIfEmpty()
join _T in bd.TipoAnimals on _A.idTipoAnimal equals _T.id     into _t 
from _T in _a.DefaultIfEmpty()
select new
{
         Nome = _C.nome,
         Animal = _A.nome,
         Tipo = _T.nome
};


É um pouco mais complicado a construção, porém  com o tempo se torna automático. 

2 comentários:

  1. Como ficaria?
    duas consultas, cada uma com uma clausula where e depois realizando um left join com as duas. De todos que tem da esquerda, mas trazer somente os que não tem na direita.
    Exemplo (SQL):
    SELECT ID, NOME FROM tbCliente
    LEFT JOIN tbOS ON tbCliente.ID = tbOS.ID_CLIENTE
    WHERE tbCliente.ID = 3 AND tbOS.ID IS NULL

    ResponderExcluir
  2. Excelente texto! Me ajudou bastante.

    ResponderExcluir