LINQ LAMBDA COM LEFT JOIN

MAXCIM 03/03/2023 12:32:28
#501089
olá amigos,

preciso fazer a junção de dois list com linq/lambda com left join a lista de clientes deve ser exibida inteira.

porem o meu join esta com comportameneto de innerjoin, trazendo só oque tem correspondente.

como falo um LEFT JOIN em linq?

a esquerda na imagem, um comparativo em MYSQL com left join, repare que nos clientes que NÂO tem ligação
DS2T 07/03/2023 00:02:26
#501100
Resposta escolhida
Opa, boa noite.

O síntaxe para obter o resultado do left join não é tão natural quanto o Inner Join. Basicamente voce cria um Group Join e realiza o DefaultIfEmpty no resultado desse agrupamento, garantindo assim que sempre retornará um valor padrão para a junção no caso de não existir correlação. Meio confuso né? Fiz um exemplo que deve ajudar.




Module Program

Public Class Cliente
Public Property Id As Integer
Public Property Nome As String

Public Sub New(id As Integer, nome As String)
Me.Id = id
Me.Nome = nome
End Sub

End Class

Public Class Ligacao
Public Property ClienteId As Integer
Public Property DataHora As DateTime

Public Sub New(clientId As Integer)
Me.ClienteId = clientId
Me.DataHora = DateTime.Now
End Sub

End Class

Private ReadOnly _clientes As List(Of Cliente) = New List(Of Cliente)(
{
New Cliente(1, "José"),
New Cliente(2, "João")
})

Private ReadOnly _ligacoes As List(Of Ligacao) = New List(Of Ligacao)(
{
New Ligacao(1),
New Ligacao(1)
})

Sub Main(args As String())

Dim linq1 = From c In _clientes
Group Join l In _ligacoes On c.Id Equals l.ClienteId Into Group
From l In Group.DefaultIfEmpty()
Select New With {
.NomeCliente = c.Nome,
.DataHoraLigacao = l?.DataHora
}

For Each p In linq1
Console.WriteLine(p.NomeCliente & " | " & p.DataHoraLigacao)
Next


End Sub


End Module

MAXCIM 07/03/2023 13:15:45
#501104
obrigado DS2T, funcionou perfeitamente. valeu
MAXCIM 09/11/2023 13:02:31
#501865
obrigado
Tópico encerrado , respostas não são mais permitidas