web-dev-qa-db-ja.com

odataで個別の値を選択する

一部のプロパティの個別の値のみを選択するodataWebサービスへの呼び出しを作成しようとしています。これを行う方法の良い例はありますか?

25
igorti

現在、ODataプロトコルは、個別の演算子、またはそのようなクエリに役立つその他の演算子をサポートしていません(一部のエンティティのプリミティブプロパティの個別の値を探していると仮定します)。通常はその機能を持つ基盤となるプロバイダーでこのようなクエリを実行するサービス操作をサーバーに実装することで、これを回避できるはずです。そして、クライアントは代わりにそのサービス操作を呼び出すことができます。

30

注:これは古いことはわかっていますが、検索応答には表示されます。現在、この問題に対する適切な解決策があります。

OData v4では、 $ apply がサポートされています。特に、$applyを使用して、結果セットから個別のフィールドセットを返すことができます。

関連する説明を参照してください: ODataQueryへのDistinctの適用

OData v4仕様 から、
クエリオプション$applyは、連続して適用されることを表すためにスラッシュで区切られた一連のセット変換を取ります。各変換の結果は次の変換への入力です$ applyは必要な関数です

tl; dr;
基本的に、多くのフィールドを持つテーブルがあるが、特定のフィールドの数の個別のレコードのみを返したい場合、最初のステップは個別の列を識別することです。それらをNameおよびIdと呼びましょう。
単に$apply関数を使用して、次のような構文のNames列とId列のみを含む個別の結果セットを取得します。

http://url.to/tableresource?$apply=groupby((Name,Id))

これを例として見てみましょう。TuberInspectionsには数千の行がありますが、請負業者はごくわずかです。フィルタリングクエリで使用するために、ドロップダウンリストに請負業者の名前を表示したいと思います。

私の個別の列はContractorNameContractorIdです

GET /odata/TuberInspections?$apply=groupby((ContractorName,ContractorId)) HTTP/1.1
Host: localhost:1230

Response:
    { 
        "@odata.context": "http://localhost:1230/odata/$metadata#TuberInspections(ContractorName,ContractorId)",
        "value": [
            {
                "@odata.id": null,
                "ContractorId": 11534,
                "ContractorName": "Kermit d'Frog"
            },
            {
                "@odata.id": null,
                "ContractorId": 11539,
                "ContractorName": "Carlos Spicy Wiener"
            },
            {
                "@odata.id": null,
                "ContractorId": 16827,
                "ContractorName": "Jen Gelfling"
            }
        ]
    }

データ構造が十分にフラットでない場合、単純なネストされた結果構造を取得するためのOOTBサポートは制限されます。

彼のデータ構造を利用するのが難しく、APIを制御できる場合は、カスタム関数を作成して、必要な特定のレコードセットを返すことを検討する必要があります。これは、さまざまなオプションを利用できる簡単な演習ですが、この応答の範囲。

この応答は、既存のODataサービスに個別の値を照会する方法に向けられており、そのような情報を提供するようにサービスを変更する方法には向けられていません。

現在、次の構文でサポートされているナビゲーションパスは1つだけです。上記のクエリは、次のように記述することもできます。

GET /odata/TuberInspections?$apply=groupby((Contractor/EntityID,Contractor/Initials))
Host: localhost:1230

Response:
    { 
         "@odata.context": "http://localhost:1230/odata/$metadata#TuberInspections(Contractor(EntityID,Initials))",
         "@odata.count": 3,
         "value": [
             {
                 "@odata.id": null,
                 "Contractor": {
                     "@odata.id": null,
                     "Initials": "KdF",
                     "EntityID": 11534
                 }
             },
             {
                 "@odata.id": null,
                 "Contractor": {
                     "@odata.id": null,
                     "Initials": "SW",
                     "EntityID": 11539
                 }
             },
             {
                 "@odata.id": null,
                 "Contractor": {
                     "@odata.id": null,
                     "Initials": "Jen",
                     "EntityID": 16827
                 }
             }
         ]
    } 

ネストまたはスタックされた$apply変換には、より高度な(複雑な)バリエーションがあります。これには、個別の結果のそれぞれに対応する一意の行の数のカウントを返すことが含まれます。

詳細については、特定の質問を投稿し、OData-v4でタグ付けしてください。必要なすべてのヘルプが見つかります:)

7
Chris Schaller