Каковы альтернативы использованию Expand в запросе сервиса данных LINQ to ADO.net?

entity-framework lazy-loading linq wcf-data-services

Вопрос

Мне интересно, есть ли альтернативы использованию ключевого слова Expand при выполнении запроса LINQ to ADO.net Data Services. Метод расширения действительно дает мне данные, которые меня интересуют, но он требует, чтобы я знал все подобъекты, с которыми я собираюсь работать заранее. Моим абсолютным предпочтением было бы, чтобы эти суб-объекты загружались для меня лениво, когда я к ним обращаюсь, но это не вариант (я мог бы добавить эту ленивую загрузку в свойство get этого суб-объекта, но стирается, когда я делаю обновление справки службы данных).

У кого-нибудь есть какие-либо предложения / лучшие практики / альтернативы для этой ситуации? Благодарю.

===== Пример кода с использованием члена с почтовым адресом =====

Работает:

var me = (from m in ctx.Member.Expand("MailingAddress")
          where m.MemberID == 10000
          select m).First();
MessageBox.Show(me.MailingAddress.Street);

Предпочитал бы (очень хотел бы, если бы это пошло и загрузило MailingAddress)

var me = (from m in ctx.Member
          where m.MemberID == 10000
          select m).First();
MessageBox.Show(me.MailingAddress.Street);

Или, по крайней мере (примечание: что-то похожее на это, с MailingAddressReference, работает на стороне сервера, если я делаю это как LINQ to Entities в Service Operation)

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);

Принятый ответ

Загрузка подобъектов через ADO.net Data Services, кажется, имеет два варианта:

Нетерпеливая загрузка

Выполнено .Expand ("[MemberVariableName]") в примере 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);

Ленивая Загрузка

Достигается путем вызова .LoadProperty для контекста и передачи ему переменной и свойства, которое должно быть загружено с отложенной загрузкой.

var me = (from m in ctx.Member          
          where m.MemberID == 10000          
          select m).First();
ctx.LoadProperty(myMember, "MailingAddresses");
MessageBox.Show(me.MailingAddress.Street);

Популярные ответы

С LINQ to Entities вы также можете использовать метод Include . Вы можете применить это ко мне после того, как оно объявлено, но до его выполнения, например:

me = me.Include("MailingAddress");


Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему