Мне интересно, есть ли какие-либо альтернативы использованию ключевого слова Expand при выполнении запроса LINQ to ADO.net Data Services. Метод расширения действительно дает мне интересующие меня данные, но он требует, чтобы я знал все подобъекты, с которыми я собираюсь работать заранее. Я абсолютно предпочитаю, чтобы эти подобъекты загружались для меня лениво, когда я к ним обращаюсь, но это не вариант (я мог бы добавить эту ленивую загрузку к получению для этого свойства подобъекта, но он стирается, когда я обновляю ссылку на службу данных).
Есть ли у кого-нибудь предложения / лучшие практики / альтернативы в этой ситуации? Спасибо.
===== Пример кода с использованием члена с почтовым адресом =====
Работает:
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 в операции службы)
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);





С LINQ to Entities вы также можете использовать Включить метод. Вы можете применить это ко мне после объявления, но до выполнения, например:
me = me.Include("MailingAddress");
Да, Include - это EF-версия Expand, но вы используете. вместо /
Загрузка подобъектов через службы данных ADO.net, похоже, имеет два варианта:
Выполнено с помощью .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 для служб данных ADO.net, поэтому .Include мне недоступен.