O artigo a seguir e mais uma colaboracao de Samir Lohmann. Desta vez Samir aborda a utilizacao de Left Join no Linq.O Linq facilita bastante a combinacao de dados de diferentesfontes, tais como DataSets, listas, etc., com o uso de JOINS. Entretanto, quem comeca a usar esse recurso, cedo ou tarde,vai querer criar um LEFT JOIN.Embora isso seja possivel, nao e muito obvio. Como veremos, o Linq sequerdefine a palavra LEFTPara comecar, vamos criar um exemplo para estabelecer oconceito de um LEFT JOIN:Digamos que eu tenha uma lista com quatro pessoas. Essaspessoas estao matriculadas em diferentes materias de um curso universitario deSistemas de In formacao, e possuem notas em cada uma dessas materias. Eu quero obter uma lista das pessoas com suas respectivasmaterias e notas; mas, se uma dessas pessoas NAO estiver matriculada, eu queroexibir o nome dela tambem, com a informacao de que ela nao esta matriculada.Lista de pessoas (tabela da esquerda): ID Nome Idade 1 Joao 20 2 Maria 21 3 Jose 22 4 Ana 23 Lista de materias com suas notas (tabela da direita): ID Pessoa Materia Nota 1 Bancos de Dados 9 2 Programacao 1 8.5 3 Antropologia 5 1 Programacao 1 8.8 Notem que a Ana (pessoa com ID = 4) nao possui nenhumregistro de materia e nota.Vamos ao codigo: primeiro, defino uma classe Pessoa.''' <summary>''' Representa uma pessoa com seus dados''' </summary>''' <remarks></remarks>Public Class Pessoa Public ID As String Public Nome As String Public Idade As Integer Public Sub New(ByVal pID As String, ByVal pNome As String, ByVal pIdade As Integer) ID = pID Nome = pNome Idade = pIdade End SubEnd ClassEu usarei um DataTable para armazenar os dados de notas,entao nao vou declarar classe para isto. Nota:Eu poderia criar uma classe paraisto tambem, mas um dos meus objetivos e mostrar um JOIN com objetos de classesdiferentes. Isso muitas vezes acontece na pratica, por exemplo, quando obtenhoos dados de sistemas diferentes.O proximo passo e popular uma lista de pessoas e o DataTableque acabei de comentar:Dim dtNotas As New DataTable ' - criacaode dados ficticios para o exemplo---------------------------------------------------- DimlstPessoas As NewList(Of Pessoa) lstPessoas.Add(NewPessoa("1", "Joao", 20)) lstPessoas.Add(NewPessoa("2", "Maria", 21)) lstPessoas.Add(NewPessoa("3", "Jose", 22)) lstPessoas.Add(NewPessoa("4", "Ana", 23)) ' -- dtNotas.Columns.Add("ID Pessoa",Type.GetType("System.String")) dtNotas.Columns.Add("Materia",Type.GetType("System.String")) dtNotas.Columns.Add("Nota",Type.GetType("System.Decimal")) Dim r As DataRow r = dtNotas.NewRow() r("IDPessoa") = "1" r("Materia")= "Bancos de Dados" r("Nota")= 9 dtNotas.Rows.Add(r) ' -- r = dtNotas.NewRow() r("IDPessoa") = "2" r("Materia")= "Programacao 1" r("Nota")= 8.5 dtNotas.Rows.Add(r) ' -- r = dtNotas.NewRow() r("IDPessoa") = "3" r("Materia")= "Antropologia" r("Nota")= 5 dtNotas.Rows.Add(r) ' -- r = dtNotas.NewRow() r("IDPessoa") = "1" r("Materia")= "Programacao 1" r("Nota")= 8.8 dtNotas.Rows.Add(r) '---------------------------------------------------------------------------------------------------------------------------Agora comeca o Linq.Em primeiro lugar, quem conhece SQL sabe que, se uma linhada tabela da esquerda no LEFTJOIN nao tiver uma ou mais correspondentes na tabela da direita, o SGBDvai devolver uma linha com os valores da tabela da esquerda mais NULLs paratodos os valores da linha da direita.No Linq, faremos umpouco diferente. Ao inves de NULLs, vamos especificar um objeto default paraser devolvido quando nao tivermos nada no lado direito.No exemplo, a tabelada direita e um DataTable que, para o Linq, sera interpretado como um IEnumerable(Of