Quais são as alternativas para o uso de expansão em uma consulta de serviço de dados LINQ para ADO.NET?
-
05-07-2019 - |
Pergunta
Gostaria de saber se há alguma alternativa para usar a palavra -chave Expanding ao executar uma consulta LINQ para ADO.NET Data Services. O método Expand me obriga os dados em que estou interessado, mas exige que eu saiba todos os subobjetos com os quais vou trabalhar com antecedência. Minha preferência absoluta seria que esses subobjetos seriam preguiçosos carregados para mim quando eu os acessos, mas isso não parece ser uma opção (eu poderia adicionar esse carregamento preguiçoso à propriedade sub-objeto, mas ela é eliminado quando faço uma atualização da referência de serviço de dados).
Alguém tem alguma sugestão/práticas recomendadas/alternativas para esta situação? Obrigado.
===== Código de exemplo usando membro que possui um MailingAddress ======
Funciona:
var me = (from m in ctx.Member.Expand("MailingAddress")
where m.MemberID == 10000
select m).First();
MessageBox.Show(me.MailingAddress.Street);
Preferiria (realmente gostaria se isso fosse e carregasse o MailingAddress)
var me = (from m in ctx.Member
where m.MemberID == 10000
select m).First();
MessageBox.Show(me.MailingAddress.Street);
Ou pelo menos (Nota: algo semelhante a isso, com o MailingAddressReference, funciona no lado do servidor, se eu o fizer como Linq para entidades em uma operação de serviço)
var me = (from m in ctx.Member
where m.MemberID == 10000
select m).First();
if (!(me.MailingAddress.IsLoaded())) me.MailingAddress.Load()
MessageBox.Show(me.MailingAddress.Street);
Solução
Carregar subobjetos via ADO.NET Data Services parece ter duas opções:
Carregamento ansioso
Realizado por .expand ([membroVariAbleName]) no exemplo do LINQ to Data Services
var me = (from m in ctx.Member.Expand("MailingAddress")
where m.MemberID == 10000
select m).First();
MessageBox.Show(me.MailingAddress.Street);
Carregamento lento
Realizado chamando .loadProperty no contexto e passando a variável e a propriedade que deve ser carregada preguiçosa.
var me = (from m in ctx.Member
where m.MemberID == 10000
select m).First();
ctx.LoadProperty(myMember, "MailingAddresses");
MessageBox.Show(me.MailingAddress.Street);
Outras dicas
Com LINQ para entidades, você também pode usar o Inclua método. Você pode aplicar isso a mim depois que é declarado, mas antes de ser executado, por exemplo:
me = me.Include("MailingAddress");