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