Каковы альтернативы использованию Expand в запросе сервиса данных LINQ to ADO.net?
-
05-07-2019 - |
Вопрос
Мне интересно, есть ли какие-либо альтернативы использованию ключевого слова 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);
Решение
Загрузка подобъектов через 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 вы также можете использовать метод включения , Вы можете применить это ко мне после того, как оно объявлено, но до его выполнения, например:
me = me.Include("MailingAddress");