Left Join with three or more lambda tables

Asked

Viewed 1,207 times

3

I have the following consultation on 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 make the same consultation with lambda, but I’m having difficulty accessing the fields of tbCidade when it’s time to do the Selectmany. What I’m trying is the following (incomplete because I can’t 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 someone help me?

@EDIT

I’m managing to do, as follows, only it doesn’t look very good. Someone could 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();

2 answers

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 that view, the consultation representing the JOIN. That way, when recovering the data, you won’t need to do the Join in the code C# because you left the complexity to the database.

  • I understand. Unfortunately here I can not change the customer’s bank

0


Ever tried to make.

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 mount 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()
  • It’s really with Linq it gets much more presentable. But what about with lambda? What it seems to me is that lambda is more presentable and readable in everything except in Join. Join with lambda is a porquera, kkkkk!

  • It’s not enough you know the ride.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.