Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Left Join com LINQ

Bom dia! Estou iniciando esse módulo. Desde já quero te dizer que o plano de aula é muito interessante. Parabéns!

Curiosidade. Nesse curso você mostra como fazer um left join com linq, ou existe alguma possibilidade de fazer? Agradeço desde já.

Abraço.

2 respostas

Olá, Ivanostik, obrigado por prestigiar nosso curso!

Em primeiro lugar, recomendo muito que você baixe o aplicativo LINQPad, que é um "playground" para estudar, desenvolver e testar consultas LINQ facilmente, sem precisar de Visual Studio!

https://www.linqpad.net/Download.aspx

Sobre consultas, imagine que você queira trazer todas as notas fiscais de clientes. Você faz um JOIN entre as coleções Clientes e NotasFiscais:

from c in Clientes
join n in NotasFiscais on c.ID equals n.ClienteID
select new
{
    NomeCliente = c.Nome,
    Numero = cn.Numero,
    Total = cn.Total
}

Mas note que essa consulta não traz os clientes que não têm notas fiscais. Nesse caso, temos que fazer um OUTER JOIN, mais especificamente um LEFT JOIN. O segredo é:

  1. identificar a coleção "nullable" (NotasFiscais) e usar o operador into para jogar o resultado numa outra coleção temporária (cliNotas)
  2. usar essa coleção temporária (cliNotas) como origem de uma nova consulta (from cn in cliNotas), especificando que, se a nota fiscal não for encontrada, devemos obter para o elemento de NotasFiscais o valor default, que é null (DefaultIfEmpty)
from c in Clientes
join n in NotasFiscais on c.ID equals n.ClienteID into cliNotas
from cn in cliNotas.DefaultIfEmpty()
select new
{
    NomeCliente = c.Nome,
    Numero = cn == null ? (decimal?) null : cn.Numero,
    Total = cn == null ? (decimal?) null : cn.Total
}

Note que tivemos que modificar a cláusula SELECT para evitar acesso indevido a propriedades caso o objeto seja nulo, ex: Total = cn == null ? (decimal?) null : cn.Total

Mais uma informação: com LINQ não é possível fazer RIGHT JOIN, apenas LEFT JOIN.

Boa sorte e bons estudos!

solução!

Show! Mais uma vez obrigado, Marcelo!