ما هي البدائل لاستخدام التوسع في Query LINQ إلى ADO.NET Data Service؟
-
05-07-2019 - |
سؤال
أتساءل عما إذا كان هناك أي بدائل لاستخدام كلمة "توسيع المفتاح" عند إجراء استعلام LINQ إلى ADO.NET Data Services. إن طريقة التوسيع تجعلني البيانات التي أهتم بها ، لكنها تتطلب مني أن أعرف جميع الكائنات الفرعية التي سأعمل معها مسبقًا. إن تفضيلي المطلق هو أن تلك الكائنات الفرعية سيتم تحميلها كسولًا بالنسبة لي عندما أصل إليها ، لكن هذا لا يبدو خيارًا (يمكنني إضافة هذا التحميل كسول إلى الحصول على تلك الخاصية الفرعية ، ولكنه لا يبدو ذلك يتم القضاء عليها عندما أقوم بتحديث مرجع خدمة البيانات).
هل لدى أي شخص أي اقتراحات/أفضل الممارسات/البدائل لهذا الموقف؟ شكرًا.
===== رمز مثال باستخدام العضو الذي يحتوي على mailingaddress ======
الأعمال:
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 ، يعمل على جانب الخادم إذا قمت بذلك كأوراق للكيانات في عملية الخدمة)
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 لديها خياران:
تحميل حريصة
تم إنجازه بواسطة .expand ([MemberVariablename]) على مثال خدمات البيانات
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 إلى الكيانات ، يمكنك أيضًا استخدام تشمل الطريقة. يمكنك تطبيق هذا لي بعد إعلانه ولكن قبل إعدامه ، على سبيل المثال:
me = me.Include("MailingAddress");