none
Trazendo referências em uma consulta (Linq to Entities) RRS feed

  • Pergunta

  • Pessoal

    Tenho uma consulta que deve retornar o seguinte: id, tipo, prefixo e número dos telefones previamente cadastrados, onde tipo (móvel, fixo...) onde tipo é referência a uma outra tabela, e por conta disto está "quebrando" a consulta, pois o campo fica como "nulo"; alguém sabe como contornar isso?

    var phones = (from p in user.Phone
                         select new {                                  
                             PhoneId = p.PhoneId,
                             PhoneTypeId = p.PhoneType.PhoneTypeId,
                             PhonePrefix = p.PhonePrefix,
                             PhoneNumber = p.PhoneNumber
                          }).ToList();
    terça-feira, 15 de setembro de 2009 17:33

Respostas

  • Olá Rodrigo,

    Pelo que vi é que no caso do EF ele trabalha com o conceito de lazyload então ele não carrega automaticamente uma propriedade que se refere a outra tabela, é necessário explicitar a entidade que vc quer carregar, então sua query ficaria assim:

    var phones = (from p in user.Phone.Include("PhoneType")
                        select new
                         {                  
                             PhoneId = p.PhoneId,
                             PhoneTypeId = p.PhoneType.PhoneTypeId,
                             PhonePrefix = p.PhonePrefix,
                             PhoneNumber = p.PhoneNumber
                          }).ToList();


    Veja se dá certo
    • Marcado como Resposta RodrigoBraga terça-feira, 22 de setembro de 2009 13:07
    sábado, 19 de setembro de 2009 19:36

Todas as Respostas

  • Rodrigo, o que você fez esta correto, deveria funcionar. Se não esta funcionando então os dados estão errados no banco (PhoneTypeId igual a um Id que não existe) ou tem alguma coisa errada no seu mapeamento (.dbml).
    []s, Victor Arias - Desenvolvedor .NET http://coderzen.spaces.live.com/
    terça-feira, 15 de setembro de 2009 17:41
  • Victor

    As informações no banco (acredito) estão corretas, se executarmos uma consulta diretamente no banco os dados são apresentados corretamente.

    Talvez fosse o caso de algo semelhante ao "entitiereference.Load()"... porém como não estou tratando de um registro único e sim uma coleção parece que por conta disto está dando erro.

    Seria algo por aí mesmo?
    terça-feira, 15 de setembro de 2009 17:48
  • Rodrigo, sinceramente não sei responder...

    Se ainda tiver o problema, tente postar aqui a query que o EF executa no banco para tentar trazer os dados.
    []s, Victor Arias - Desenvolvedor .NET http://coderzen.spaces.live.com/
    quinta-feira, 17 de setembro de 2009 10:52
  • Como eu posso capturar a consulta?

    Se bem que eu acredito que o problema não seja a consulta em si; é que o objeto retornado não "carrega" a propriedade "PhoneType" e consquente não traz o seu ID, que é justamente o que eu preciso :(
    quinta-feira, 17 de setembro de 2009 13:29
  • Para capturar a consulta você pode dar um .ToString na query (antes de chamar ToList) ou utilizar algum profiler do seu banco de dados.

    Eu dei uma relida no seu código e percebi um detalhe... PhoneTypeId ja não é uma propriedade do proprio elemento Phone?
    []s, Victor Arias - Desenvolvedor .NET http://coderzen.spaces.live.com/
    quinta-feira, 17 de setembro de 2009 13:52
  • "Não necessáriamente" :)

    Phone possui uma propriedade PhoneType... e o PhoneTypeId não é uma propriedade diretamente de Phone.

    Exemplificando o "objeto" phone... tem básicamente a estrutura abaixo:

    Phone
        PhoneType
            PhoneTypeId
            PhoneTypeName
        PhonePrefix
        PhoneNumber

    E como eu comentei... na minha consulta por "Phone", eu preciso trazer também detalhes de outros objetos que compõem o Phone, caso do PhoneType
    quinta-feira, 17 de setembro de 2009 14:08
  • Olá Rodrigo,

    Pelo que vi é que no caso do EF ele trabalha com o conceito de lazyload então ele não carrega automaticamente uma propriedade que se refere a outra tabela, é necessário explicitar a entidade que vc quer carregar, então sua query ficaria assim:

    var phones = (from p in user.Phone.Include("PhoneType")
                        select new
                         {                  
                             PhoneId = p.PhoneId,
                             PhoneTypeId = p.PhoneType.PhoneTypeId,
                             PhonePrefix = p.PhonePrefix,
                             PhoneNumber = p.PhoneNumber
                          }).ToList();


    Veja se dá certo
    • Marcado como Resposta RodrigoBraga terça-feira, 22 de setembro de 2009 13:07
    sábado, 19 de setembro de 2009 19:36
  • Paiva

    Deu erro de compilação, como o objeto user tem uma propriedade que é na verdade uma coleção (de Phones), talvez por isso; pode ser?

    "Include" nem aparece na relação de métodos.

    Tenho tentado formas de "sair" do lazyload, para conseguir carregar o PhoneType... mas ainda sem sucesso.
    segunda-feira, 21 de setembro de 2009 14:19
  • Paiva

    Na verdade a base estava mapeada errada, com "muitos para muitos", quando na verdade deveria estar "um para muitos", após esse ajuste funcionou :)

    Valeu pela dica!
    terça-feira, 22 de setembro de 2009 13:08