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 é:
- identificar a coleção "nullable" (NotasFiscais) e usar o operador into para jogar o resultado numa outra coleção temporária (cliNotas)
- 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!