Question:
I have the following SQL
query:
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 difficulty accessing the tbCidade
fields when doing SelectMany . What I'm trying is the following (incomplete as I can't see the tbCidade
fields):
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();
can anybody help me?
@EDIT
I'm getting it done, like the one below, only it doesn't look very good. Could anyone come up with 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();
Answer:
Already tried to do.
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()