Ultimamente tenho recebido nos treinamentos varios alunos tem me perguntado se e possivel fazer LEFT JOIN em consultas LINQ estão resolvi escrever este pequeno artigo com um exemplo de como fazer. Espero poder abrir um caminho que os levara a consultas LINQ cada vez mais otmizadas e inteligente.
Vamos ao exemplo:
Para isso vou utilizar as tabelas de Customers e de Orders ( Clientes e Pedidos) no Banco de Dados Northwind, adcionei um novo Cliente sem nenhum pedido, vou criar um SELECT com LEFT JOIN que me retorne todos os clientes que o nome comece com a letra(“F”) mesmo que eles não tenham registros na tabela de pedido.
NorthwindDataContext db= new NorthwindDataContext();
var query= from c in db.Customers
where c.CustomerID.StartsWith("F")
join o in db.Orders on c.CustomerID equals o.CustomerID into sr
from x in sr.DefaultIfEmpty()
select new {CustomerID= c.CustomerID, ContactName=c.ContactName, OrderID = x.OrderID == null ? -1 : x.OrderID};
Veja que eu usei o operador join into na Query o que resultou em um LEFT JOIN, Eu adcionei meu filtro no final da clausula WHERE, e retornei um tipo anonimo que contem CustomerID, ContactName, e OrderID onde -1 corresponde os clientes que não tem nenhum pedido e os que tem pedido retornamos o ID do pedido.
Veja a string SQL correspondente:
SELECT [t0].[CustomerID], [t0].[ContactName],
(CASE
WHEN [t1].[OrderID] IS NULL THEN @p1
ELSE [t1].[OrderID]
END) AS [value]
FROM [dbo].[Customers] AS [t0]
LEFT JOIN [dbo].[Orders] AS [t1] ON [t0].[CustomerID] = [t1].[CustomerID]
WHERE [t0].[CustomerID] LIKE @p0
Observe como o LEFT JOIN aparece, perceba como o case reflete IF/ELSE que eu adicionei na Query acima.
Bons Códigos...