SubQuery with Linq

2

I need to query Linq for an object called Client. This object has a relationship with another object, which is a List of phones. For each of the phones, there is a type: 'Casa', 'Comercial', 'Recado' , etc.

I want to bring everything in the same query. How do I do this with Linq?

Here's the example of what's already done:

var pf = (from p in contexto.PFPJ
                      join pais in contexto.Pais on p.IDPais equals pais.ID
                      join profissao in contexto.Profissao on p.IDProfissao equals profissao.ID
                      join cargos in contexto.Cargo on p.IDCargo equals cargos.ID
                      join nacionalidade in contexto.Nacionalidade on p.IDNacionalidade equals nacionalidade.ID
                      join estadoCivil in contexto.EstadoCivil on p.IDEstadoCivil equals estadoCivil.ID

                      select new
                          {
                             ID = p.ID,
                             RazaoSocial_Nome = p.RazaoSocial_Nome,
                             NomeFantasia = p.NomeFantasia,
                             CNPJ_CPF = p.CNPJ_CPF,
                             IE_RG = p.IE_RG,
                             DataNascimento = p.DataNascimento,
                             Sexo = p.Sexo,
                             IDPais = p.IDPais,
                             NomePais = pais.Nome,
                             IDProfissao = p.IDProfissao,
                             NomeProfissao = profissao.Nome,
                             IDCargo = p.IDCargo,
                             NomeCargo = cargos.Nome,
                             IDNacionalidade = p.IDNacionalidade,
                             NomeNacionalidade = nacionalidade.Nome,
                             IDEstadoCivil = p.IDEstadoCivil,
                             NomeEstadoCivil = estadoCivil.Nome,
                             Telefones = contexto.Telefone.Where(t => t.IDPFPJ == p.ID).ToList(),
                          }).AsEnumerable().Select(x => new PFPJ
                          {
                             ID = x.ID,
                             RazaoSocial_Nome = x.RazaoSocial_Nome,
                             NomeFantasia = x.NomeFantasia,
                             CNPJ_CPF = x.CNPJ_CPF,
                             IE_RG = x.IE_RG,
                             DataNascimento = x.DataNascimento,
                             Sexo = x.Sexo,
                             IDPais = x.IDPais,
                             NomePais = x.NomePais,
                             IDProfissao = x.IDProfissao,
                             NomeProfissao = x.NomeProfissao,
                             IDCargo = x.IDCargo,
                             NomeCargo = x.NomeCargo,
                             IDNacionalidade = x.IDNacionalidade,
                             NomeNacionalidade = x.NomeNacionalidade,
                             IDEstadoCivil = x.IDEstadoCivil,
                             NomeEstadoCivil = x.NomeEstadoCivil,
                             Telefones = x.Telefones
                          }).ToList();

Some joins are already correct. What I need now is to fill in the Phone types for each phone in the List, in this same query, how can I do it?

    
asked by anonymous 15.02.2016 / 18:45

1 answer

2

I would do extension method for this.

public partial class VwClienteTelefone
    {
        public PFPJ PFPJ_ { get; set; }
        public pais pais_ { get; set; }
        public profissao profissao_ { get; set; }
        public nacionalidade nacionalidade_ { get; set; }
        public estadoCivil estadoCivil_ { get; set; }
    }

    public static class ClientesExt
    {
        public static IQueryable<VwClienteTelefone> VwCamposFormulario(
            this IQueryable<PFPJ> qrIn, Context ctx)
        {
            return qrIn
                .Select(pfpj =>
                    new
                    {
                        PFPJ_ = pfpj,
                        pais_ = ctx.pais.FirstOrDefault(p => p.ID == pfpj.IDPais),
                        profissao_ = ctx.profissao.FirstOrDefault(p => p.ID == pfpj.IDProfissao),
                        cargos_ = ctx.cargos.FirstOrDefault(p => p.ID == pfpj.IDCargo),
                        nacionalidade_ = ctx.nacionalidade.FirstOrDefault(p => p.ID == pfpj.IDNacionalidade),
                        estadoCivil_ = ctx.nacionalidade.FirstOrDefault(p => p.ID == pfpj.IDEstadoCivil),
                    })
                    .Select(p => new 
                    {
                        ID = p.ID,
                        RazaoSocial_Nome = p.RazaoSocial_Nome,
                        NomeFantasia = p.NomeFantasia,
                        CNPJ_CPF = p.CNPJ_CPF,
                        IE_RG = p.IE_RG,
                        DataNascimento = p.DataNascimento,
                        Sexo = p.Sexo,
                        IDPais = p.IDPais,
                        NomePais = pais.Nome,
                        IDProfissao = p.IDProfissao,
                        NomeProfissao = profissao.Nome,
                        IDCargo = p.IDCargo,
                        NomeCargo = cargos.Nome,
                        IDNacionalidade = p.IDNacionalidade,
                        NomeNacionalidade = nacionalidade.Nome,
                        IDEstadoCivil = p.IDEstadoCivil,
                        NomeEstadoCivil = estadoCivil.Nome,
                        Telefones = contexto.Telefone.Where(t => t.IDPFPJ == p.ID).ToList(),
                    })
                    .Select(x => new VwClienteTelefone
                    {
                        ID = x.ID,
                        RazaoSocial_Nome = x.RazaoSocial_Nome,
                        NomeFantasia = x.NomeFantasia,
                        CNPJ_CPF = x.CNPJ_CPF,
                        IE_RG = x.IE_RG,
                        DataNascimento = x.DataNascimento,
                        Sexo = x.Sexo,
                        IDPais = x.IDPais,
                        NomePais = x.NomePais,
                        IDProfissao = x.IDProfissao,
                        NomeProfissao = x.NomeProfissao,
                        IDCargo = x.IDCargo,
                        NomeCargo = x.NomeCargo,
                        IDNacionalidade = x.IDNacionalidade,
                        NomeNacionalidade = x.NomeNacionalidade,
                        IDEstadoCivil = x.IDEstadoCivil,
                        NomeEstadoCivil = x.NomeEstadoCivil,
                        Telefones = x.Telefones
                    });
        }
    }
    
15.02.2016 / 19:21