Quais são as alternativas para o uso de expansão em uma consulta de serviço de dados LINQ para ADO.NET?

StackOverflow https://stackoverflow.com/questions/177520

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);
Foi útil?

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");
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top