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