Subquery with Linq

Asked

Viewed 113 times

2

I need to consult with Linq on 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?

Follow the example of what is 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 the types of Phone to each List phone, in this same query, how can I do?

  • The type is in the table Phone?

  • Marconcilio 'Tipotelefone' is another object. It is in the object Phone. Relacione assim:Phone.Idtipotelefone = Tipotelefone.ID

  • I need to fetch Tipotelefone for each List object. Note: Modeling is not my fault kkkk

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
                    });
        }
    }
  • Marconcilio 'Tipotelefone' is another object. It is in the object Phone. Relacione assim:Phone.Idtipotelefone = Tipotelefone.ID

  • I need to fetch Tipotelefone for each List object. Note: Modeling is not my fault kkkk

  • you can fetch your data the same way you did for the Telefones = contexto.Telefone.Where(t => t.IDPFPJ == p.ID).ToList(), in your last select if it is 1 p/ 1 use firstordefault instead of Where.

  • Typotelefone = context.TipoTelefone.Where(t => t.ID == x.Idtipotelefone). Tolist(),

  • I got it. the relationship eh 1/1. Only I want to fill the object 'Tipotelefone', inside the object 'Phone'. For each Phone. How it would look in the select?

Browser other questions tagged

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