Left Join with three or more tables with lambda

3

I have the following query in SQL :

select
e.idEstado, e.txtNomeEstado, e.txtSiglaEstado,
c.idCidade, c.txtNomeCidade,
de.txtH1, de.txtTitulo, de.txtDescricaoEstado, de.txtDescription
from tbDescricaoEstado de
left join tbCidade c on de.idCidade = c.idCidade
left join tbEstado e on de.idEstado = e.idEstado

And I'm trying to do the same query with lambda , but I'm having trouble accessing the tbCidade fields when making SelectMany . What I am trying is the following (incomplete because I can not see the fields of tbCidade ):

DescricaoEstadoECidade DescricaoEstadoECidade = bd.tbDescricaoEstado
            .GroupJoin(bd.tbCidade, de => de.idCidade, c => c.idCidade, (de, c) => new { De = de, C = c.DefaultIfEmpty() })
            .GroupJoin(bd.tbEstado, c => c.De.idEstado, e => e.idEstado, (c, e) => new { C = c, E = e.DefaultIfEmpty() })
            .SelectMany(final => final.E,
                    (final, e) => new
                    { idEstado = e.idEstado, txtNomeEstado = e.txtNomeEstado, txtSiglaEstado  = e.txtSiglaEstado
                      idCidade = final.C.C.? 
                    })
            .toList();

Could anyone help me?

@EDIT

I can do it, as in the following, but it does not look very good. Could someone present a better way?

var DescricoesEstadosECidades = bd.tbDescricaoEstado
            .GroupJoin(bd.tbCidade, de => de.idCidade, c => c.idCidade, (de, c) => new { De = de, C = c.DefaultIfEmpty() })
            .SelectMany(final => final.C,
                    (final, c) => new
                    {
                        idCidade = c.idCidade,
                        txtNomeCidade = c.txtNomeCidade,
                        txtH1 = final.De.txtH1,
                        txtTitulo = final.De.txtTitulo,
                        txtDescricaoEstado = final.De.txtDescricaoEstado,
                        txtDescription = final.De.txtDescricaoEstado,
                        idEstado = final.De.idEstado
                    }
                    )
                    .GroupJoin(bd.tbEstado, de => de.idEstado, e => e.idEstado, (de, e) => new { De = de, E = e.DefaultIfEmpty() })
                    .SelectMany(final => final.E,
                            (final, e) => new
                            {
                                idEstado = e.idEstado,
                                txtNomeEstado = e.txtNomeEstado,
                                txtSiglaEstado = e.txtSiglaEstado,
                                idCidade = final.De.idCidade,
                                txtNomeCidade = final.De.txtNomeCidade,
                                txtH1 = final.De.txtH1,
                                txtTitulo = final.De.txtTitulo,
                                txtDescricaoEstado = final.De.txtDescricaoEstado,
                                txtDescription = final.De.txtDescription
                            }
                    )
            .ToList();
    
asked by anonymous 14.12.2017 / 13:56

2 answers

0

You've tried.

var result = (from de in ctx.tbDescricaoEstado
            join c in ctx.tbCidade  on de.idCidade equals c.idCidade into c1 from c2 in c1.DefaultIfEmpty()
            join e in ctx.tbEstado  on de.idEstado equals e.idEstado into e1 from e2 in e1.DefaultIfEmpty()
            select new 
           {
                e2.idEstado,                
                e2.txtNomeEstado,               
                e2.txtSiglaEstado,              
                c2.idCidade, 
                c2.txtNomeCidade,
                de.txtH1, 
                de.txtTitulo, 
                de.txtDescricaoEstado, 
                de.txtDescription
           }).ToList()

Another form of mounts would be.

var result = ctx.tbDescricaoEstado
    .Select(de => new 
    {
           DescEstado = de,
           cidades = ctx.tbCidade.Where(c => c.idCidade == de.idCidade),
           Estados = ctx.tbEstado.Where(e => e.idEstado == de.idEstado),
    })
    .Select(x => new 
    {
                x.Estados.idEstado,                
                x.Estados.txtNomeEstado,               
                x.Estados.txtSiglaEstado,              
                x.cidades.idCidade, 
                x.cidades.txtNomeCidade,
                x.DescEstado.txtH1, 
                x.DescEstado.txtTitulo, 
                x.DescEstado.txtDescricaoEstado, 
                x.DescEstado.txtDescription
    }).ToList()
    
15.12.2017 / 17:14
0

A suggestion for your case is: When using entity-framework and want to make a JOIN with many tables, create a view and a model to map this view .

In this view , place the query that represents the JOIN . That way, when you retrieve the data, you will not have to join in the C# code because you left the complexity for the database .

    
14.12.2017 / 14:04