c# - 返回实体引用的 OData v4.0 集合
问题描述
根据 OData 4.0 JSON 格式文档,实体集合可以表示为实体引用的集合,而不是实体本身(参见示例 29)。
我找不到在 WebAPI 控制器中实现此功能的正确方法。
假设我有以下模型类:
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
public string Summary { get; set; }
}
构建器如下:
private static IEdmModel Build()
{
var builder = new ODataConventionModelBuilder();
var product = builder.EntitySet<Product>("Product");
product.EntityType.HasKey(x => x.Id);
product.HasIdLink(x => x.GenerateSelfLink(false), false);
return builder.GetEdmModel();
}
以及以下(非常基本的)控制器:
public class ProductController : ODataController
{
private List<Product> products = Enumerable
.Range(1, 2)
.Select(x => new Product
{
Id = x,
Summary = $"Product summary {x}",
Name = $"Product name {x}",
Price = x * 2
})
.ToList();
[HttpGet]
[EnableQuery]
public IActionResult Get()
{
return this.Ok(this.products);
}
[HttpGet]
[EnableQuery]
public IActionResult Get([FromODataUri] int key)
{
return this.Ok(this.products[key - 1]);
}
}
这是一个正常的收集请求的样子:
{
"@odata.context": "https://localhost:5001/odata/$metadata#Product",
"value": [
{
"@odata.id": "https://localhost:5001/odata/Product(1)",
"Id": 1,
"Name": "Product name 1",
"Price": 2,
"Summary": "Product summary 1"
},
{
"@odata.id": "https://localhost:5001/odata/Product(2)",
"Id": 2,
"Name": "Product name 2",
"Price": 4,
"Summary": "Product summary 2"
}
]
}
根据 OData 规范,产品实体引用的集合应如下所示:
{
"@odata.context": "https://localhost:5001/$metadata#Collection($ref)",
"value": [
{
"@odata.id": "https://localhost:5001/odata/Product(1)"
},
{
"@odata.id": "https://localhost:5001/odata/Product(2)"
}
]
}
如何定义一个只返回Product
集合中 a 的实体表示的函数?我找不到合适的东西ODataConventionModelBuilder
来标记这样的功能或在控制器中创建这样的功能。
我在 Github 上挖掘了一些源代码,发现了这个ODataEntityReferenceLinksSerializer,但是它提到这仅用于导航属性,我需要简单地返回Product
集合的所有标识符。
解决方案
推荐阅读
- assembly - 当我要检查包括寄存器在内的数据时,为什么 x 命令显示“无法将值转换为整数”?
- jsdoc - jsdoc - 记录嵌套数组参数
- typescript - 打字稿`Pick`意外地允许任何属性值
- sql - 根据上一个问题的答案选择 MCQ 答案计数
- python - 在虚拟环境中安装相同依赖的两个不同版本
- node.js - 如何让节点在返回文档之前等待?
- git - 我无法推送 GitHub 提交 - RPC 失败;curl 55 发送失败:连接被中止
- python-requests - Python requests_Query_String_Multiple_Values
- google-cloud-platform - 是否为帐户启用了 Google Drive API 仅提供对该驱动器的完全权限?
- autodesk-forge - 使用 SendStringtoExecute 时伪造错误(命令 ^C^C)