Série LINQ to SQL Parte 5 - Criando querys com JOIN entre tabelas
Como vocês já devem ter percebido, a linguagem LINQ é muito semelhante a uma query SQL e essa tem sido uma das grandes vantagens do LINQ.
Nesse post vamos explorar mais um desses recursos, a utilização de JOIN entre duas tabelas em uma consulta e faremos o bind do resultado em um gridView do ASP.NET
Crie uma nova página ListarTodosProdutos.aspx e desenhe o leiaute como da seguinte forma:

Em seguida, clique duas vezes sobre o form e codifique o evento Page_Load() conforme o código abaixo:
protected void Page_Load(object sender, EventArgs e)
{
BlogLinqDemoDataContext db = new BlogLinqDemoDataContext();
var query = from p in db.Produtos
join c in db.CategoriaProdutos on p.CategProdID equals c.CategProdID
select new {
ID = p.ProdutoID,
Produto = p.Descricao,
Categoria = c.Descricao };
GridView1.DataSource = query;
GridView1.DataBind();
}
Veja que a query do LINQ é muito parecida com uma query T-SQL. É feito uma query na tabela de Produtos com um JOIN com a tabela de CategoriaProdutos a fim de recuperar a descrição da Categoria. Em seguida o select new determina quais campos serão selecionados e inclusive escolhendo alias para cada campo. Ao efetuar o bind no GridView, é possível ver a execução conforme tela abaixo:

Outros tipos de JOINS
No exemplo acima executamos o conhecido INNER JOIN, mas é claro que poderíamos executar outros tipos de join como LEFT JOIN, RIGHT JOIN, etc. Veja os próximos exemplos:
LEFT JOIN
var query = from produtos in db.Produtos
join categorias in db.CategoriaProdutos on produtos.CategProdID equals categorias.CategProdID into x
from categorias in x.DefaultIfEmpty()
select new {
ID = produtos.ProdutoID,
Produto = produtos.Descricao,
Categoria = categorias.Descricao };
No exemplo acima são exibidos todos os produtos que possuam ou não categorias relacionadas. No caso dos produtos sem categoria, retorna NULL. Coloquei sublinhando o que difere de um INNER JOIN que é o fato de atribuir o relacionamento à um objeto que dei o nome de "x" e depois informar que a tabela de CategoriaProdutos é DefaultIfEmpty() informando que se não houver categoria o Produto sera exibido da mesma forma.
RIGHT JOIN
var query = from produtos in db.Produtos.DefaultIfEmpty()
join categorias in db.CategoriaProdutos on produtos.CategProdID equals categorias.CategProdID into x
from prod in x
select new {
ID = prod.CategProdID,
Categoria = prod.Descricao};
No exemplo acima são exibidos todos as categorias que possuam produtos relacionadas. O resultado dessa query será esse:

No próximo post dessa série, vou mostrar como executar querys utilizando recursos de GROUP, SELECT IN e outros.
Até lá