Odata v4 - $扩展然后平坦的结果

时间:2016-11-15 17:12:55

标签: odata odata-v4

  

目标:展开对象,并将嵌套属性投影到根选择上,以及其他道具。

拥有以下关系:

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)

这可以实现吗?谢谢!

P.S。 OData V4。

1 个答案:

答案 0 :(得分:1)

使用odata v4查询语义无法实现这一点。如您所见,响应正文包含一行:

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

这表示整个响应有效负载代表'产品'类型。假设' CategoryName'该类型不存在属性,无法指示服务动态通过' AS'添加一个条款。关键字' AS'标准OData查询规范中也不存在。

但是,在元数据之外返回其他属性确实有效,请参阅Reference

  

客户必须准备好接收实体中的其他属性   或者未在元数据中公布的复杂类型实例,即使是   类型未标记为开放。

因此,在这种情况下,该服务可能只返回一个额外的虚拟' property' CategoryName'在回应中。 (如果您是服务所有者,则可以更新响应逻辑并进行更改。)这可能是服务行为,而不是对某些客户端查询的反应。