0

目的:オブジェクトを展開し、ネストされたプロパティを他のプロップと一緒にルート選択に投影します。

次の関係があります。

public class Product {
   public string Barcode { get; set; }
   public double Price { get; set; }
   public Category Category { get; set; }
}

public class Category {
   public string Name { get; set; }
}

私はこれをもたらす投影をしたいと思います:

{
   "@odata.context": "http://localhost/odata/$metadata#Product",
   "value": [
      {
         "Price": 500,
         "Name": "Meat Products" // this is category name, ideally would be to rename it to CategoryName
      }
   ]
}

現在、私はこれを取得しています:

{
   "@odata.context": "http://localhost/odata/$metadata#Product",
   "value": [
      {
         "Price": 500,
         "Category": {
            "Name": "Meat Products"
         }
      }
   ]
}

使用されるクエリは次のとおりです。

/odata/Product?$expand=Category($select=Name)&$select=Price

私はこのような投影を書くことを期待しています:

/odata/Product?$expand=Category&$select=Price,Category/Name as CategoryName

また

/odata/Product?$expand=Category&$select=Price,Category($select=Name as CategoryName)

また

/odata/Product?$expand=Category&$select=Price,Category($select=Name)

それは達成可能ですか?ありがとうございました!

PS OData V4.

4

1 に答える 1

1

これは、odata v4 クエリ セマンティックでは達成できません。ご覧のとおり、応答本文には次の行が含まれています。

"@odata.context": "http://localhost/odata/$metadata#Product"

これは、応答ペイロード全体が「製品」タイプのインスタンスを表していることを示しています。「CategoryName」プロパティがそのタイプに存在しないと仮定すると、「AS」句を介して動的に追加するようにサービスに指示することはできません。また、キーワード「AS」も標準の OData クエリ仕様には存在しません。

ただし、メタデータ以外の追加のプロパティを返すことは実際には有効です。参照を参照してください。

クライアントは、オープンとしてマークされていない型であっても、メタデータでアドバタイズされていないエンティティまたは複合型インスタンスで追加のプロパティを受け取る準備ができている必要があります。

したがって、この場合、サービスは応答で追加の「仮想」プロパティ「CategoryName」を返すことができます。(サービスの所有者であれば、応答ロジックを更新して変更を行うことができます。) これは、特定のクライアント クエリに対する反応ではなく、サービスの動作である可能性があります。

于 2016-11-21T09:01:45.773 に答える