Fazendo Inner Join e Left Join com Linq no ASP.NET

06/07/2011 11:22

Relacionamentos é fundamental em um banco de dados. Com o aumento do uso de LINQ nas aplicações, com certeza vai ser também.

  • O Inner Join é quando existe dados de ambos os relacionamentos.
  • O Left Join pega os registros da Esquerda mesmo que os da Direita não existam.


Para começar vamos criar um Model, uma classe que “simula” uma tabela do banco de dados.

public struct Pessoa   {       public Pessoa(int _codigo, string _nome, int _idade, char _sexo)       {           Codigo = _codigo;           Nome = _nome;           Idade = _idade;           Sexo = _sexo;       }       public int Codigo;       public string Nome;       public int Idade;       public Char Sexo;   }  


Agora que nosso Model já está pronto, vamos criar os dados para teste, primeiro vamos fazer um Inner Join.

List<Pessoa> Pessoas = new List<Pessoa>();   // Homens   Pessoas.Add(new Pessoa(1, "Leonardo", 20, 'M'));   Pessoas.Add(new Pessoa(2, "João", 17, 'M'));   Pessoas.Add(new Pessoa(3, "Luis", 30, 'M'));   // Mulheres   Pessoas.Add(new Pessoa(1, "Tamires", 18, 'F'));   Pessoas.Add(new Pessoa(2, "Maria", 15, 'F'));   Pessoas.Add(new Pessoa(3, "Luiza", 28, 'F')); 


1 Homem para 1 mulher.

Agora vamos relacionar e mostrar na tela:

var lst = from h in Pessoas       join m in Pessoas on h.Codigo equals m.Codigo       where h.Sexo == 'M' && m.Sexo == 'F'       select new { Homem = h.Nome, Mulher = m.Nome };   	   foreach (var item in lst)       Console.WriteLine(String.Format("{0} - {1}", item.Homem, item.Mulher));  



O exemplo acima mostra o funcionamento simples do join no linq, agora vamos ao left join que é um pouco mais complicado:

List<Pessoa> Homens = new List<Pessoa>();   // Homens   Homens.Add(new Pessoa(1, "Leonardo", 20, 'M'));   Homens.Add(new Pessoa(2, "João", 17, 'M'));   Homens.Add(new Pessoa(3, "Luis", 30, 'M'));   // Mulheres   List<Pessoa> Mulheres = new List<Pessoa>();   Mulheres.Add(new Pessoa(1, "Tamires", 18, 'F'));     var lst = from h in Homens       join m in Mulheres on h.Codigo equals m.Codigo       into child       from m in child.DefaultIfEmpty(new Pessoa(h.Codigo, "Não possui", 0, 'F'))       where h.Sexo == 'M' && m.Sexo == 'F'       select new { Homem = h.Nome, Mulher = m.Nome };   	   foreach (var item in lst)       Console.WriteLine(String.Format("{0} - {1}", item.Homem, item.Mulher)); 



No exemplo acima é como se jogasse o “join” em uma tabela temporária, e para os registros que não tiveram relacionamento ele joga um item default.