目标: 展开一个对象,并将嵌套属性与其他道具一起投影到根选择上。
具有以下关系:
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 v4 查询语义无法实现这一点。正如您所看到的,响应正文包含一行:
"@odata.context": "http://localhost/odata/$metadata#Product"
这表明整个响应负载代表“产品”类型的实例。假设该类型不存在“CategoryName”属性,则无法指示服务通过“AS”子句“动态”添加一个属性。标准 OData 查询规范中也不存在关键字“AS”。 但是,返回元数据之外的附加属性确实是有效的,请参阅
参考客户必须准备好接收实体中的附加属性 或未在元数据中公布的复杂类型实例,即使对于 类型未标记为开放。因此在这种情况下,服务可以在响应中返回一个附加的“虚拟”属性“CategoryName”。 (如果您是服务所有者,您可以更新响应逻辑并进行更改。)这可能是一种服务行为,而不是对某些客户端查询的反应。
compute
函数来展平响应。 假设您有一个具有如下对象属性的类:
class A {
}