展開
Version 25.3.9411
Version 25.3.9411
展開
API Server はOData の$expand 機能をサポートしています。これにより、単一リクエストでレコードおよび関連エンティティからのデータを提供できます。これを有効にするには、API Server テーブルでエンティティ間のリレーションシップを定義する必要があります。
リレーションシップ
OData の$expand 機能を使用する前に、API Server API ページでリソース間のリレーションシップを定義する必要があります。詳しくは、API ページを参照してください。エンティティ間のリレーションシップを定義する方法はいくつかあります。次の例では、Product / Category リレーションシップを使用します。
スキーマエディタの使用
リレーションシップを定義するカラムにrelationships XML 属性を追加することによって、スキーマエディタでリレーションシップを手動で定義できます。属性は次の形式にする必要があります:relationshipName(TableName.ColumnName)。複数のリレーションシップを区切るには、パイプ記号(|)を使います。リレーションシップ定義の書式は、カーディナリティによって異なります。カーディナリティのオプションについて、次のセクションで説明します。
一対多リレーションシップ
親オブジェクトのスキーマ内の主キーに対応するスキーマエントリに一対多のリレーションシップを定義します。次の例に示すように、リレーションシップ名はカーディナリティを示すアスタリスク(*)で始まります:
<attr name="CategoryID" key="true" type="int" columnsize="11"
isNullable="false" readonly="false" relationships="*Products(Product.CategoryID)"
desc="" />
多対一リレーションシップ
子オブジェクトのスキーマ内の外部キーに対応する行に多対一のリレーションシップを定義します:
<attr name="CategoryID" key="false" type="int" columnsize="11"
isNullable="true" readonly="false" relationships="ProductsCategory(Category.CategoryID)"
desc="" />
パートナー属性
リレーションシップの名前に@ 接頭辞を付けると、パートナー属性を追加することができます。以下に例を示します。
Tip:詳しくは、Partner 属性に関するOData ドキュメントを参照してください。
一対多のリレーションシップでアスタリスク(*)を含む場合:
relationships="*@Products(Product.CategoryID)"
多対一のリレーションシップの場合:
relationships="@ProductsCategory(Category.CategoryID)"
重要:アプリケーションではパートナー属性の検証は行われません。この機能を使用する場合は、次の条件を満たしていることを確認する必要があります:
- 逆リレーションシップが
パートナー属性で定義およびマークされる。 - 逆リレーションシップの名前が複数形の有無を含めて、現在の項目の名前と全く同じである。
OData Expand 構文
関連エンティティ間のリレーションシップを定義したら、$expand キーワードを使用して、単一の要求で関連オブジェクトのセットだけでなくレコードプロパティも選択できます。$expand クエリ構文の詳細については、OData ドキュメントを参照してください。
一対多リレーションシップ
各基底レコードに対して、すべての関連オブジェクトを取得します。
リクエスト
http://MyServer:MyPort/api.rsc/Categories(1)?$expand=Products
レスポンス
{
"@odata.context": "http://localhost:8153/api.rsc/$metadata#Categories",
"value": [
{
"CategoryID": "1",
"CategoryName": "Books",
"Products": [
{
"ProductID": "101",
"Price": "45",
"Name": "Astronomy 101",
"Supplierid": "1",
"CompanyId": "1",
"CategoryId": "1"
},
{
"ProductID": "102",
"Price": "50",
"Name": "Physics 101",
"Supplierid": "2",
"CompanyId": "1",
"CategoryId": "1"
},
{
"ProductID": "103",
"Price": "65",
"Name": "Chemistry 101",
"Supplierid": "3",
"CompanyId": "1",
"CategoryId": "1"
}
]
}
]
}
多対一リレーションシップ
各レコードに対して、関連する親レコードを取得します。
リクエスト
http://MyServer:MyPort/api.rsc/Products?$expand=ProductsCategory&$filter=price lt 60&$orderby=price desc
レスポンス
{
"@odata.context": "http://localhost:8153/api.rsc/$metadata#Products",
"value": [
{
"ProductId": 102,
"Name": "Physics 101",
"Price": "50",
"CategoryId": "1",
"ProductsCategory": [
{
"CategoryName": "Books",
"CategoryId": "1"
}
]
},
{
"ProductId": 101,
"Name": "Astronomy 101",
"Price": "45",
"CategoryId": "1",
"ProductsCategory": [
{
"CategoryName": "Books",
"CategoryId": "1"
}
]
}
]
}
複数の展開
$expand パラメータは、多対一と一対多リレーションシップを組み合わせたカンマ区切りリストの値をとることができます。
リクエスト
http://MyServer:MyPort/api.rsc/Products(102)?$expand=Supplier,ProductReviews
レスポンス
{
"@odata.context": "http://localhost:8153/api.rsc/$metadata#Products",
"value": [
{
"ProductId": 102,
"Name": "Physics 101",
"Price": "50",
"ProductReviews": [
{
"ProductReviewID": "1001",
"ProductId": "102",
"Rating": "4.5",
"Description": "Easy to read, good illustrations."
},
{
"ProductReviewID": "1002",
"ProductId": "102",
"Rating": "1.5",
"Description": "Boring!"
}
],
"Supplier": [
{
"SupplierId": "1",
"SupplierName": "New Science Publishing"
}
]
}
]
}
展開オプション
OData API の呼び出しでは、$expand オプションを使用して、返す関連エンティティをより詳細に定義することができます。拡張オプションはセミコロンで区切られたリストで関連エンティティにカッコを付けて指定します。
Select
$select は、関連するエンティティのどのカラムを返すかを定義します。指定がない場合は、利用可能なすべての値が返されます。次に例を示します:
http://MyServer:MyPort/api.rsc/Products(102)?$expand=ProductReviews($select=Description),Supplier($select=SupplierName)
Filter
$filter を使用して、関連する結果に適用する条件を定義します。この条件に適合しない関連エンティティは応答から除外されます。次に例を示します:
http://MyServer:MyPort/api.rsc/Products(102)?$expand=ProductReviews($select=Rating;$filter=Rating ge 4)