Каковы альтернативы использованию Expand в запросе сервиса данных LINQ to ADO.net? - PullRequest
5 голосов
/ 07 октября 2008

Мне интересно, есть ли какие-либо альтернативы использованию ключевого слова 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 Service)

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

Ответы [ 2 ]

9 голосов
/ 10 октября 2008

Загрузка подобъектов через 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);
3 голосов
/ 07 октября 2008

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

me = me.Include("MailingAddress");
...