Usuário com melhor resposta
Trazendo referências em uma consulta (Linq to Entities)

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();
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
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/ -
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? -
-
-
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/ -
"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 -
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
-
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. -