Usuário com melhor resposta
Dúvida Lazy Loading, carregar entidade filha

Pergunta
-
Bom dia senhores.
Tenho a seguinte dúvida, tenho a uma entidade A que tem uma propriedade para a Entidade B, quando faço datacontext.Set<A>().where(a=>a.B.Name == "Valor") estoura uma exception.
Quando faço datacontext.Set<A>().ToList().where(a=>a.B.Name == "Valor") ele faz o filtro na entidade B, alguém sabe me dizer por que? Porque quando chamo o ToList() ele carrega tudo no contexto do aplicativo certo?
Respostas
-
Amigo,
você quer saber o por que dele tentar carrega a entidade B ? por que você tentou acessar uma propriédade desta entidade referênciada. tente antes do where colocar um .Include("NOMEENTIDADE").where..
assim ele irá carregar a entidade
Olavo Oliveira Neto
http://olavooneto.wordpress.com
Twitter @Olavooneto
Facebook Olavo Neto
Linkedin Olavo Neto
Se for útil marque como resposta e faça um Developer feliz :)- Marcado como Resposta Cesar Mendes da Silva terça-feira, 11 de junho de 2013 19:21
-
Olá César,
Duas perguntas, então terá duas respostas...
Pergunta 1 => provavelmente vc esta recebendo "um Object not set to instance of an object" quando executa a sua query. Isso ocorre porque alguma tupla da tabela A no seu banco de dados nãoesta associada com uma instância da tabela B. Neste caso mude a sua query para algo como:
var query = datacontext.Set<A>().where(a => a.B != null && a.B.Name == "Valor");
Pergunta 2 => Esse modo de fazer a query é bastante errado, pois quando vc executa o "ToList()" vc força a execução da query, isso siginifica execução de SQL, mais mapeamento dos resultados e consumo de memória com os seus resultados. Assim, o EF vai trazer todos os dados da tabela A para a memória (péssima ideia) e então vai filtrar os dados que estão em memória atrás das entidades de B que se adequam ao seu filtro.
Qual exception vc esta recebendo ao executar a primeira query?
[]s!
MSc. Fernando Henrique Inocêncio Borba Ferreira
Microsoft MVP - Visual C#
while(alive){ this.WriteCode(); }
Blog: http://ferhenriquef.com/
Twitter: @ferhenrique
Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil- Marcado como Resposta Cesar Mendes da Silva terça-feira, 11 de junho de 2013 19:21
-
Opa fernando blz, então na verdade eu resolvi da seguinte forma.
//Adicionei
using System.Data.Entity
//Coloquei o include tipado.
//Acredito que seja a forma correta de se fazer.
datacontext.Set<A>().Include(a=>a.B).where(a=>a.B.Name == "Valor")
- Marcado como Resposta Cesar Mendes da Silva terça-feira, 11 de junho de 2013 19:20
Todas as Respostas
-
Amigo,
você quer saber o por que dele tentar carrega a entidade B ? por que você tentou acessar uma propriédade desta entidade referênciada. tente antes do where colocar um .Include("NOMEENTIDADE").where..
assim ele irá carregar a entidade
Olavo Oliveira Neto
http://olavooneto.wordpress.com
Twitter @Olavooneto
Facebook Olavo Neto
Linkedin Olavo Neto
Se for útil marque como resposta e faça um Developer feliz :)- Marcado como Resposta Cesar Mendes da Silva terça-feira, 11 de junho de 2013 19:21
-
Olá César,
Duas perguntas, então terá duas respostas...
Pergunta 1 => provavelmente vc esta recebendo "um Object not set to instance of an object" quando executa a sua query. Isso ocorre porque alguma tupla da tabela A no seu banco de dados nãoesta associada com uma instância da tabela B. Neste caso mude a sua query para algo como:
var query = datacontext.Set<A>().where(a => a.B != null && a.B.Name == "Valor");
Pergunta 2 => Esse modo de fazer a query é bastante errado, pois quando vc executa o "ToList()" vc força a execução da query, isso siginifica execução de SQL, mais mapeamento dos resultados e consumo de memória com os seus resultados. Assim, o EF vai trazer todos os dados da tabela A para a memória (péssima ideia) e então vai filtrar os dados que estão em memória atrás das entidades de B que se adequam ao seu filtro.
Qual exception vc esta recebendo ao executar a primeira query?
[]s!
MSc. Fernando Henrique Inocêncio Borba Ferreira
Microsoft MVP - Visual C#
while(alive){ this.WriteCode(); }
Blog: http://ferhenriquef.com/
Twitter: @ferhenrique
Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil- Marcado como Resposta Cesar Mendes da Silva terça-feira, 11 de junho de 2013 19:21
-
Opa fernando blz, então na verdade eu resolvi da seguinte forma.
//Adicionei
using System.Data.Entity
//Coloquei o include tipado.
//Acredito que seja a forma correta de se fazer.
datacontext.Set<A>().Include(a=>a.B).where(a=>a.B.Name == "Valor")
- Marcado como Resposta Cesar Mendes da Silva terça-feira, 11 de junho de 2013 19:20