Odata v4 - $展开然后展平结果

问题描述 投票:0回答:2

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

具有以下关系:

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)

这可以实现吗?谢谢!

附注OData V4.

odata odata-v4
2个回答
1
投票

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

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

这表明整个响应负载代表“产品”类型的实例。假设该类型不存在“CategoryName”属性,则无法指示服务通过“AS”子句“动态”添加一个属性。标准 OData 查询规范中也不存在关键字“AS”。 但是,返回元数据之外的附加属性确实是有效的,请参阅

参考

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

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


0
投票
compute

函数来展平响应。 假设您有一个具有如下对象属性的类:

class A {

}

	
© www.soinside.com 2019 - 2024. All rights reserved.