Usuário com melhor resposta
.NET Framework - Como Usar JOIN utilizando ObjectContext no Entity FrameWork

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.
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
- Marcado como Resposta Leandro Alexandrino dos Santos terça-feira, 19 de novembro de 2013 14:09
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
- Marcado como Resposta Leandro Alexandrino dos Santos terça-feira, 19 de novembro de 2013 14:09
-
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?
-
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
-
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