首页 > 解决方案 > 返回实体引用的 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集合的所有标识符。

标签: c#odataasp.net-core-webapi

解决方案


推荐阅读