Odata v4 - $expand 然后 flutter 结果

Odata v4 - $expand then flattern result

Objective: To expand an object, and project a nested property, onto the root selection, alongside with other props.

有如下关系:

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.

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

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

这是为了指示整个响应有效负载表示 'Product' 类型的实例。假设 'CategoryName' 属性 在该类型上不存在,则不可能指示服务 动态地 通过 'AS' 子句添加一个。标准 OData 查询规范中也不存在关键字 'AS'。

但是,return 元数据之外的额外 属性 确实有效,请参阅 Reference

Clients MUST be prepared to receive additional properties in an entity or complex type instance that are not advertised in metadata, even for types not marked as open.

所以在这种情况下,服务可以在响应中 return 额外的 'virtual' 属性 'CategoryName'。 (如果您是服务所有者,您可以更新响应逻辑并进行更改。)这可能是一种服务行为,而不是对特定客户端查询的反应。