Fazendo Inner Join e Left Join com Linq no ASP.NET
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.