none
SubQuery com Linq RRS feed

  • Pergunta

  • Boa tarde

    Estou com a seguinte situação:

    Preciso fazer uma consulta com linq de um objeto chamado Cliente.

    Esse objeto tem um relacionamento com outro objeto, que se trata de uma List  de telefones.

    Para cada um dos telefones, existe um tipo: 'Casa', 'Comercial', 'Recado', etc.

    Quero trazer tudo na mesma consulta.

    Como faço isso com linq?

    Segue exemplo do que já está feito:

    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();

    Alguns 'joins' já estão corretos. O que preciso agora é preencher os os tipos de Telefone a cada telefone da List, neste mesmo select.

    Alguma sugestão?

    segunda-feira, 15 de fevereiro de 2016 17:31

Todas as Respostas

  • Abaixo coloquei um left join nos telefones.

    Se o campo telefone for uma lista conforme abaixo.

    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
     join telefones in contexto.Telefone on p.ID equals telefones .IDPFPJ into meusTelefones

                          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 = meusTelefones.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();

    Caso o telefone seja um objeto, apenas um exemplo abaixo já que não conheço sua classe.

    meusTelefones.Where(t=> t.Tipo == Celular).FirstOrDefault()

    • Sugerido como Resposta Ricardo dos Sntos terça-feira, 16 de fevereiro de 2016 00:18
    segunda-feira, 15 de fevereiro de 2016 18:19
  • Ricardo bom dia

    Como havia mencionado, até este ponto está correto.

    O sistema já está buscando a List<> de Telefones.

    Só que esse objeto 'Telefone' tem um outro objeto chamado 'TipoTelefone'.

    O que preciso é preencher também cada um dos Telefones da List com o objeto 'TipoTelefone'.

    Faremos isso pela FK.

    Sendo: Telefone.IDTipoTelefone == TipoTelefone.ID

    O que não estou conseguindo fazer é toda essa busca no mesmo select do linq.

    Não quero ter que percorrer todos os clientes (PFPJ) novamente.

    Espero que possam me ajudar.

    E agradeço pela ajuda até aqui.

    quarta-feira, 17 de fevereiro de 2016 11:43