web-dev-qa-db-ja.com

Odataサービスを照会し、Child of Childエンティティを展開することは可能ですか?

これはかなり単純に聞こえますが(おそらくここで明らかなことを見逃しているかもしれません)、解決策を見つけることができません。エンティティにクエリを実行して、これを実行する1つまたは複数の直接の子エンティティを返すことができることはわかっています。

var query = from c in Service.Clients.Expand("Addresses,Comments,PhoneNumbers")..

私がやりたいのは、3つのレベル(子供の子供)で同じことをすることです。たとえば、「国->地方->都市」または「ブランド->家族->モデル」としましょう。

すべてのエンティティを拡張しようとしましたが、失敗します

var query = from c in Service.Brands.Expand("Families,Models").. //fails,
//which even makes some sense, since Models is a Child of Family, not Brand
var query = from c in Service.Brands.Expand("Families").. //this works, 
//but Family.Models is empty

これを1つのクエリで行う方法はありますか、それともこれを2つの別々のクエリに分割する必要がありますか?

21
Andreas

次のステートメントは、探しているものを返すはずです。

var query = from c in Service.Brands.Expand("Families/Models")

これにより、次のodataクエリが実行されます。

.../OData.svc/Brands?$expand=Families/Models

ここ はいくつかのさらなるodataドキュメントへのリンクです:

$ expandクエリオプションの構文は、ナビゲーションプロパティのコンマ区切りのリストです。さらに、各ナビゲーションプロパティの後にスラッシュと別のナビゲーションプロパティを続けて、マルチレベルの関係を識別できるようにすることができます。

30
Gene C

ASP.NET OData v4では、URL規則が変更されたようです。今です:

~/Brands?$expand=Families($expand=Models)

サブエンティティで必要なものを選択することもできます。
たとえば、ブランドファミリー識別子のみが必要な場合:

~/Brands?$expand=Families($select=Id)

さらに、ブランドファミリーモデルの識別子のみが必要な場合は、次のようにします。

~/Brands?$expand=Families($expand=Models($select=Id))

...等々。お役に立てれば !

26
rama