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.
Como ficaria?
ResponderExcluirduas 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
Excelente texto! Me ajudou bastante.
ResponderExcluir