LINQ to ADO.netデータサービスクエリでExpandを使用する代替手段は何ですか?
-
05-07-2019 - |
質問
LINQ to ADO.net Data Servicesクエリを実行するときに、Expandキーワードを使用する代替手段があるかどうか疑問に思っています。 expandメソッドを使用すると、関心のあるデータを取得できますが、事前に操作するサブオブジェクトをすべて知る必要があります。私の絶対的な好みは、それらのサブオブジェクトにアクセスすると、それらのサブオブジェクトが遅延ロードされることですが、これはオプションではないようです(この遅延ロードをそのサブオブジェクトプロパティの取得に追加できますが、データサービスリファレンスを更新すると消去されます)。
この状況に対する提案/ベストプラクティス/代替案はありますか?ありがとう。
===== 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);
または少なくとも(注:サービスオペレーションのLINQ to Entitiesとして行う場合、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 Data Servicesを介したサブオブジェクトのロードには、2つの選択肢があるようです:
Eager Loading
LINQ to Data Servicesの例の.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 to Entitiesでは、 Includeメソッドも使用できます。 。これは、宣言された後、実行される前に適用できます。例:
me = me.Include("MailingAddress");