none
.NET Framework - Como Usar JOIN utilizando ObjectContext no Entity FrameWork RRS feed

  • Pergunta

  • Bom dia Pessoal,

    Gostaria de saber como eu faço uma consulta com JOIN usando Entity Framework (ObjectContext)?

    Tenho duas tabelas, a tbconhecimento que contém a FK fkDestinatario e a tabela tbEnvolvido que contém a PK pkid, estou tentando fazer uma consulta de Conhecimentos em que traz o Nome (razao social) do envolvido também.

    Abaixo segue meu codigo para entenderem melhor...

    Como eu tenho pesquisado, descobri que o Entity Framework faz os JOINs internamente, não necessariamente precisando fazer codificando. Então fiz minha primeira tentativa assim.:

                    var query = context.CreateObjectSet<tbconhecimento>().Where(p => p.pkid != 0 && p.fkemitente == IDEMCTe && p.tbenvolvidos.pkid == p.fkdestinatario);
    
    
                    List<CTeLista> listaEnv = new List<CTeLista>();
    
                    // Iteração para recuperar os dados em uma lista
                    foreach (tbconhecimento result in query)
                    {
                        CTeLista objEnvolvidoslista = new CTeLista();
    
                        objEnvolvidoslista.ID = result.pkid;
                        objEnvolvidoslista.Destinatario = result.tbenvolvidos.atrazao; // Esta Vindo Nulo
    
                        listaEnv.Add(objEnvolvidoslista);
                    }
    
                    return listaEnv;

    Utilizei esta linha de código para trazer a razao social da tabela tbEnvolvido, mas esta vindo nulo. Entao comecei a pesquisar como fazer o JOIN utilizando ObjectContext, só que não estou conseguindo montar o JOIN em meu sistema, gostaria que alguem me ajudasse. Abaixo segue como esta.:

    var query = context.CreateObjectSet<tbconhecimento>().Where(p => p.pkid != 0 && p.fkemitente == IDEMCTe);
    query = query.Join(context.CreateObjectSet<tbenvolvidos>(), u => u.fkdestinatario, us => us.pkid, (u, us) => { u, us });
    
    

    Por favor se alguem puder me ajudar serei muito grato.


    terça-feira, 19 de novembro de 2013 13:07

Respostas

  • Fala ai Leandro,

    Cara eu fiz aqui de cabeça e não sei se tá correto, vou pedir para você alterar um pouco, mas acredito que seja isso aqui(mais ou menos).

    //Em LINQ eu acho mto mais bonito
     List<CTeLista> listaEnv = 
            from c in context.tbenvolvidos 
            join p in context.tbconhecimento on c.pkid equals p.fkdestinatario 
    	where p.fkemitente == IDEMCTe
            select new CTeLista{ 
    	ID = c.pkid, 
    	Destinatario = p.atrazao}; 
    
    //Em lambda é meio tenso mesmo
    var query = context.tbenvolvidos
                       .Join(context.tbconhecimento, a => a.pkid, u => u.fkdestinatario,
                             (a, u) => new { a, u })
                       .Where(r => r.u.fkemitente == IDEMCTe)
    		   .Select(q => new CTeLista{
                                      ID = r.a.pkid, 
                                      Destinatario = r.u.atrazao
                                    })
    		   .ToList();

    Abss

    terça-feira, 19 de novembro de 2013 13:42

Todas as Respostas

  • Fala ai Leandro,

    Cara eu fiz aqui de cabeça e não sei se tá correto, vou pedir para você alterar um pouco, mas acredito que seja isso aqui(mais ou menos).

    //Em LINQ eu acho mto mais bonito
     List<CTeLista> listaEnv = 
            from c in context.tbenvolvidos 
            join p in context.tbconhecimento on c.pkid equals p.fkdestinatario 
    	where p.fkemitente == IDEMCTe
            select new CTeLista{ 
    	ID = c.pkid, 
    	Destinatario = p.atrazao}; 
    
    //Em lambda é meio tenso mesmo
    var query = context.tbenvolvidos
                       .Join(context.tbconhecimento, a => a.pkid, u => u.fkdestinatario,
                             (a, u) => new { a, u })
                       .Where(r => r.u.fkemitente == IDEMCTe)
    		   .Select(q => new CTeLista{
                                      ID = r.a.pkid, 
                                      Destinatario = r.u.atrazao
                                    })
    		   .ToList();

    Abss

    terça-feira, 19 de novembro de 2013 13:42
  • Cara muito obrigado, deu certo.

    não mudou muita coisa, ficou assim .:

                    var query2 = context.CreateObjectSet<tbenvolvidos>()
                                       .Join(context.CreateObjectSet<tbconhecimento>(), a => a.pkid, u => u.fkremetente,(a, u) => new { a, u })
                                       //.Join(context.CreateObjectSet<tbconhecimento>(), a => a.pkid, u => u.fkdestinatario, (a, u) => new { a, u })
                                       .Where(r => r.u.fkemitente == IDEMCTe)
                                       .Select(q => new CTeLista
                                       {
                                           ID = q.u.pkid,
                                           Destinatario = q.a.atrazao
                                       })
                                       .ToList();

    A linha comentada é que estava tentando fazer outro join de outra FK da tabela tbconhecimento que irei usar também a mesma PK da tabela tbenvolvido para pegar o razao social tbm. 

    Não querendo abusar, mas vc pode me auxliar de como faço multiplos JOINS no meu caso?

    terça-feira, 19 de novembro de 2013 14:12
  • Fala Leandro,

    Dá uma olhada nesse post para ver se te ajuda

    http://stackoverflow.com/questions/13179802/convert-linq-to-lambda-with-multiple-joins

    Dá uma estudada e qualquer coisa posta aqui o código ate onde você conseguiu.

    Abs

    terça-feira, 19 de novembro de 2013 16:43
  • Obrigado, mas logo após eu tentei fazer com a forma que vc me passou usando LINQ e deu certo, segue o codigo abaixo.:

                    List<CTeLista> listaCTe =(
                           from c in context.CreateObjectSet<tbconhecimento>()
                           join p in context.CreateObjectSet<tbenvolvidos>() on c.fkdestinatario equals p.pkid
                           join q in context.CreateObjectSet<tbenvolvidos>() on c.fkremetente equals q.pkid
                           where c.fkemitente == IDEMCTe
                           select new CTeLista
                           {
                               ID = c.atconhecid,
                               Remetente = q.atrazao,
                               Destinatario = p.atrazao,
                               Chave = c.atchavecte,
                               Situacao = c.atsituacao,
                               Total = c.attotalconhec
                           }).ToList(); 

    Muito Obrigado cara, me ajudou muito. Parabens.

    Vlw

    terça-feira, 19 de novembro de 2013 16:50