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á

 

6 thoughts on “Série LINQ to SQL Parte 5 – Criando querys com JOIN entre tabelas

  1. Olá, tudo bem? Estou tentando fazer um select com o left join e não estou conseguindo fazer a iteração, como faço para isso? Ocorre o seguinte erro:

    LINQ to Entities does not recognize the method ‘<>f__AnonymousType9`5[System.Int32,System.String,System.String,System.Int32,System.String] ElementAtOrDefault[<>f__AnonymousType9`5](System.Linq.IQueryable`1[<>f__AnonymousType9`5[System.Int32,System.String,System.String,System.Int32,System.String]], Int32)’ method, and this method cannot be translated into a store expression.

    Obrigado desde já,
    Leandro

  2. E ai Andrey, beleza?

    Minha questão está em como colocar essa pesquisa em uma Classe de negócio. Qual o tipo de retorno que devo utilizar uma vez que não consigo usar o List, pois ele retorna uma Entidade ‘Nova’ ou mesclada. Observe Meu código:
    public List
    RecuperarTodosProdutos()
    {
    var query = from regProduto in dconBlogDemo.Produtos
    join regCategoriaProduto in dconBlogDemo.CategoriaProdutos
    on regProduto.CategProdID equals regCategoriaProduto.CategProdID
    select new { ID = regProduto.ProdutoID,
    Descricao = regProduto.Descricao,
    Categoria = regCategoriaProduto.Descricao};
    return query.ToList();
    }

    Muito obrigado!

  3. Olá Emiliano,

    Não entendi o problema em colocar esse método em uma classe de negócio. Não há problema algum em retornar uma lista de Produtos List<Produto>. Você está recebendo alguma mensagem de erro nessa sua query ? Ao invés de usar o “select new” tente usar somente “select regProduto;”

    abs

  4. Buenas!

    Se eu utilizar o regProduto eu retorno um Objeto Produto, dessa forma não vou ter a Descrição da categoria do produto. Na verdade o que eu quero fazer é colocar a query linq que você fez nesse post dentro de uma classe de negócio e setar o dataSource do gridView da seguinte forma:

    beProduto produto = new beProduto();
    GridView1.DataSource = produto.RecuperaTodosProdutos();

    Valew!

  5. Olá Emiliano,

    Então o que você quer fazer é exatamente o que eu fiz no post. Qual o problema que você está tendo em retornar a lista de produtos exibindo a categoria de cada produto?

    Como você mesmo fez, deu nome à cada campo de retorno e é exatamente esse nome que você vai usar de bind nas colunas da GridView.

    O seu código está correto, ainda não entendi qual dificuldade você está tendo em colocar esse método numa classe de negócios.

    abs

Leave a Reply

Your email address will not be published. Required fields are marked *