none
Utilizando inner join em ADO RRS feed

  • Pergunta

  • Bom dia, tenho a seguinte consulta em sql

     SELECT
        t.nome as local_terminal,
        l.nome as tipo_local,
        p.ano_inicio as ano_inicio,
        p.ano_termino as ano_termino,
        d.budget_total as budget_total,
        s.descricao as status_descricao,
        d.codigo as codigo
      FROM tb_demanda_terminal d
        INNER JOIN tb_status_demanda_terminal s ON (s.codigo = d.codigo_status_demanda_terminal)
        INNER JOIN tb_conta_demanda_terminal c ON (c.codigo_demanda_terminal = d.codigo_terminal)
        INNER JOIN tb_projeto p ON (p.codigo_conta = c.codigo_conta)
        INNER JOIN tb_terminal t ON (t.codigo = d.codigo_terminal)
        INNER JOIN tb_tipo_local l ON (l.codigo = t.codigo_tipo_terminal)

    e preciso utilizá-la no ADO, estava tentando fazer assim:

    var dtd = new DemandaTerminalService().BuscarTodos().ToList<tb_demanda_terminal>();
    var st_dtd = new StatusDemandaTerminalDistribuicaoService().BuscarTodos().ToList<tb_status_demanda_terminal>();

    dtd = from d in dtd
                          join s in st_dtd on s.codigo equals d.codigo_status_demanda_terminal
                          join c in tb_conta_demanda_terminal on c.codigo_demanda_terminal equals d.codigo_terminal
                          join p in tb_projeto on p.codigo_conta equals c.codigo_conta
                          join t in tb_terminal on t.codigo equals d.codigo_terminal
                          join l in tb_tipo_local on l.codigo equals t.codigo_tipo_terminal
                           select new
                                    {
                                        local_terminal = t.nome,
                                        tipo_local = l.nome,
                                        ano_inicio = p.ano_inicio,
                                        ano_termino = p.ano_termino,
                                        budget_total = d.budget_total,
                                        status_descricao = s.descricao,
                                        codigo = d.codigo
                                    };

    Porém não está funcionando, saberiam me dizer o porque?

    Att.

    terça-feira, 26 de junho de 2012 18:21

Respostas

Todas as Respostas

  • Olá MnMk,

    Pelo que vi no seu código esta faltando o seu DataContext. Vc deveria fazer algo como:

    using (SeuContexto contexto = new SeuContexto())
    {
    var query = from d in contexto.tb_demanda_terminal
          join s in contexto.st_dtd on s.codigo equals d.codigo_status_demanda_terminal
          join c in contexto.tb_conta_demanda_terminal on c.codigo_demanda_terminal equals d.codigo_terminal
          join p in contexto.tb_projeto on p.codigo_conta equals c.codigo_conta
          join t in contexto.tb_terminal on t.codigo equals d.codigo_terminal
          join l in contexto.tb_tipo_local on l.codigo equals t.codigo_tipo_terminal
          select new
                    {
                        local_terminal = t.nome,
                        tipo_local = l.nome,
                        ano_inicio = p.ano_inicio,
                        ano_termino = p.ano_termino,
                        budget_total = d.budget_total,
                        status_descricao = s.descricao,
                        codigo = d.codigo
                    };
    }

    []s!

    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique
    Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil

    terça-feira, 26 de junho de 2012 18:29
    Moderador
  • Contexto vc quer dizer o que exatamente? arquivo de conexão?

    Att.

    terça-feira, 26 de junho de 2012 18:39
  • Olá MnMk,

    Quando me refiro ao contexto estou falando sobre o objeto criado pelo Entity Framework para que vc faça conexões com o banco de dados.

    Veja este artigo: http://msdn.microsoft.com/pt-br/library/jj128159

    Nele, o contexto se chama MVA_EF4entities, e é utilizado para fazer as consultas na base de dados, como no código abaixo:

    using (MVA_EF4Entities context = new MVA_EF4Entities())
    {
        var query = context.Produto.Where(p => p.Custo > 100);
    
    
        foreach (var item in query)
        {
    Console.WriteLine("{0} – {1} – {2:C}",item.Id,item.Nome, item.Custo); 
        }
        Console.Read();
    }
    

    Vc esta utilizando o Entity Framework, certo?

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique
    Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil

    terça-feira, 26 de junho de 2012 18:46
    Moderador
  • Sim, estou usando Entity Framework.

    Fazer consulta com uma única tabela não é problema, meu problema está sendo trabalhar com o inner join usando Entity Framework.

    terça-feira, 26 de junho de 2012 19:03
  • Perfeito,

    Vc poderia postar um print screen do seu modelo de tabelas (criado a partir do Entity Framework) ou um pedaço de código onde vc trabalhar com o Entity Framework para que consiga me basear na construção da sua query?

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique
    Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil

    terça-feira, 26 de junho de 2012 19:05
    Moderador
  • Olá MnMk,

    Vc poderia postar um bloco de código onde vc faz uso do Entity Framework, só para que eu consiga identificar o nome do seu contexto de acesso a dados.

    Obrigado

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique
    Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil

    terça-feira, 26 de junho de 2012 19:36
    Moderador
  • Olá MnMk,

    Na verdade este código que vc passou não é do Entity Framework. Estou interessado no código da classe "EmpresaService".

    Esta classe é um serviço?

    O join, para ser realizado e para ser performático, deve ser realizado na fonte dos seus dados, na camada mais baixa da sua aplicação, na camada de acesso a dados.

    No caso, pelo o qe notei, este código é da camada de visão, onde existem os componentes visuais.

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique
    Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil

    terça-feira, 26 de junho de 2012 19:47
    Moderador
  • Olá MnMk,

    Opa! Estamos chegando quase la :)

    Na verdade preciso do código da classe "EmpresaRepositorio", esse código provavelmente faz referência ao contexto.

    No caso, o TransactionScope cria uma transação com o banco de dados, ele tem outra utilidade diferente do contexto do Entity Framework.

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique
    Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil

    terça-feira, 26 de junho de 2012 19:55
    Moderador
  • Segue o codigo do EmpresaRepositorio

    public class EmpresaRepositorio : BaseRepositorio<tb_empresa>
        {
            
        }

    terça-feira, 26 de junho de 2012 20:04
  • Não sei se pode ser isso, mas você poderia navegar nos objetos de acordo com os relacionamentos do seu próprio modelo de entidades ao invés de forçar "join"/"on...". Assim seguiria o mapeamento objeto relacional sem riscos. Dá uma olhada no exemplo que está verdinho: http://stackoverflow.com/questions/1695975/linq-to-entities-searching-in-entitycollection-navigation-properties
    terça-feira, 26 de junho de 2012 23:32
  • Olá MnMk,

    O comentário do rs.developer é bastante válido.

    Mas, pelo que me parece, tanto para a primeira solução, quanto para a solução do amigo rs.developer algumas coisas precisarão ser modificadas.

    Precisamos ver o código da classe BaseRepositorio para saber onde esta seu contexto, e se esta classe herdar de outra que faz o uso do contexto teremos de ver seu código e assim por diante. A classe EmpresaRepositorio não diz nada na verdade, apenas implementa uma interface.

    Me parece que vc esta utilizando uma solução genérica para sua camada de acesso a dados.

    Poste o código da classe EmpresaRepositorio e veremos o que podemos fazer.

    A solução é bem simples, mas devido a sua hierarquia de classes temos de localizar onde o acesso a dados realmente esta sendo feito.

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique
    Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil

    quarta-feira, 27 de junho de 2012 13:03
    Moderador
  • Pensei em fazer assim mas não funcionou, por isso estava tentando fazer utilizando o join.
    quarta-feira, 27 de junho de 2012 15:22
  • Olá MnMk,

    Recomendo que vc crie a classe Demanda, assim como abaixo:

    public class Demanda
    {
    `	public string local_terminal { get; set; }
    	public string tipo_local { get; set; }
    	public int ano_inicio { get; set; }
    	public int ano_termino { get; set; }
    	public decimal budget_total { get; set; }
    	public string status_descricao { get; set; }
    	public int codigo { get; set; }
    }
    

    ps.: Pode ser que um tipo de dados ou outro varie, depende do tipo de retorno da sua consulta, vc corrige os tipos de dados conforme ver que não batem com a sua consulta.

    E na classe EmpresaRepositorio crie o seguinte método:

    public IEnumerable<Demanda> GetDemanda()
    {
    
    var query = from d in db.tb_demanda_terminal
          join s in db.st_dtd on s.codigo equals d.codigo_status_demanda_terminal
          join c in db.tb_conta_demanda_terminal on c.codigo_demanda_terminal equals d.codigo_terminal
          join p in db.tb_projeto on p.codigo_conta equals c.codigo_conta
          join t in db.tb_terminal on t.codigo equals d.codigo_terminal
          join l in db.tb_tipo_local on l.codigo equals t.codigo_tipo_terminal
          select new Demanda
                    {
                        local_terminal = t.nome,
                        tipo_local = l.nome,
                        ano_inicio = p.ano_inicio,
                        ano_termino = p.ano_termino,
                        budget_total = d.budget_total,
                        status_descricao = s.descricao,
                        codigo = d.codigo
                    };
    return query.ToList();
    }

    Vamos ver o resultado.

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique
    Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil

    quarta-feira, 27 de junho de 2012 15:47
    Moderador
  • Consegui resolver navegando por dentro da estrutura do objeto, agradeço a ajuda.

    Att.

    quinta-feira, 28 de junho de 2012 15:23
  • Olá MnMk,

    Vc fez alguma modificação no código para isso ocorrer?
    Se sim, poderia postar o código?

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique
    Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil

    quinta-feira, 28 de junho de 2012 16:37
    Moderador