Usuário com melhor resposta
Dúvida e Dificuldade com LEFT JOIN usando LAMBDA EXPRESSION

Pergunta
-
Bom dia pessoal , estou com uma grande dúvida e dificuldade de implementar um left join com expression lambda Vejam meu cenário :
public class Curso { public int IdCurso { get; set; } public int? IdTipoCurso { get; set; } public string Nome { get; set; } } public class TipoCurso { public int IdTipoCurso { get; set; } public string Tipo { get; set; } }
no código acima estou simulando uma tabela de curso e tipo curso abaixo vejam o preenchimento delas :
List<TipoCurso> lstTipoCurso = new List<TipoCurso>{ new TipoCurso{ IdTipoCurso=1, Tipo = "WEB" }, new TipoCurso{IdTipoCurso=2 , Tipo = "Desktop"}, new TipoCurso{IdTipoCurso=3, Tipo="Movél"} }; List<Curso> lstCurso = new List<Curso> { new Curso{ IdCurso= 1 , IdTipoCurso = 1 , Nome = "C#"}, new Curso{ IdCurso = 2 , IdTipoCurso = 1, Nome = "VB.Net"}, new Curso{ IdCurso= 3 , IdTipoCurso = 3 , Nome = "Android com C#"}, new Curso{ IdCurso= 4 , IdTipoCurso = null, Nome = "Hacker"}, new Curso{ IdCurso= 5 , IdTipoCurso = null , Nome = "Hardware"} };
Bom o fato agora é que estou tentando usar left join da seguinte maneira :
var ListaGeral = lstCurso.GroupJoin(lstTipoCurso, C => C.IdTipoCurso, T => T.IdTipoCurso, (C, T) => new { C , T }) .SelectMany(n => n.T.DefaultIfEmpty() ,(C,T) => new { C.C.Nome , T.Tipo}) .ToList(); foreach (var Cur in ListaGeral) { Console.WriteLine("Curso : {0} , Tipo : {1} ", Cur.Nome, Cur.Tipo); }
Esse código acima não funciona como o esperado e dá erro de object no referenciado , ou seja não consegue instaciar a classe TipoCurso . Se eu comento as linhas :
//new Curso{ IdCurso= 4 , IdTipoCurso = null, Nome = "Hacker"},
//new Curso{ IdCurso= 5 , IdTipoCurso = null , Nome = "Hardware"}Funciona perfeitamente como JOIN , mas quando volto as linhas dá erro .
O esperado é que lista todos os cursos independente de ter ou não tipo , realmente como seria um left join. Se puderem me ajudar agradeço desde já.
Davi Murilo Referência Principal : Jesus que ilumina minha mente.
Referência Profissonal : http://www.tidm.com.br
Respostas
-
Olá!
Isso deve lhe ajudar:
var ListaGeral = lstCurso .GroupJoin(lstTipoCurso, Curso => Curso.IdTipoCurso, Tipo => Tipo.IdTipoCurso, (C, T) => new { C, T }) .SelectMany(n => n.T.DefaultIfEmpty(), (n, T) => new { n.C.Nome, Tipo = ((T == null)? string.Empty : T.Tipo) }) .ToList();
[]s!MSc. Fernando Henrique Inocêncio Borba Ferreira
Microsoft MVP - Visual C#
while(alive){ this.WriteCode(); }
Blog: http://ferhenriquef.com/
Twitter: @ferhenrique
Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil- Marcado como Resposta Davi Murilo domingo, 14 de abril de 2013 21:45
Todas as Respostas
-
Alguém , se puder ajudar estou quebrando a cabeça e não chego a solução desse left join usando nativamente o GroupJoin e o SelectMany ?
Davi Murilo Referência Principal : Jesus que ilumina minha mente.
Referência Profissonal : http://www.tidm.com.br -
Olá!
Isso deve lhe ajudar:
var ListaGeral = lstCurso .GroupJoin(lstTipoCurso, Curso => Curso.IdTipoCurso, Tipo => Tipo.IdTipoCurso, (C, T) => new { C, T }) .SelectMany(n => n.T.DefaultIfEmpty(), (n, T) => new { n.C.Nome, Tipo = ((T == null)? string.Empty : T.Tipo) }) .ToList();
[]s!MSc. Fernando Henrique Inocêncio Borba Ferreira
Microsoft MVP - Visual C#
while(alive){ this.WriteCode(); }
Blog: http://ferhenriquef.com/
Twitter: @ferhenrique
Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil- Marcado como Resposta Davi Murilo domingo, 14 de abril de 2013 21:45
-
Fernando muito obrigado deu certo.
Davi Murilo Referência Principal : Jesus que ilumina minha mente.
Referência Profissonal : http://www.tidm.com.br