如何通过 OData 4 和 WebApi 2.2 公开导航 属性?

How do I expose a navigation property over OData 4 and WebApi 2.2?

我在一个模型上有一个导航 属性,Site.Locality 虽然它的外键是序列化的并且可供消费者使用 (Site.LocalityName),但我希望地点本身是可从:

~/Site('A')/Locality

这是如何在 OData v4 中通过 WebApi 2.2 完成的?

Site 实体的控制器上,添加以下操作:

// Implies that the controller has [ODataRoutePrefix("Sites")]

[ODataRoute("({name})/Locality")]
public async Task<Locality> GetLocality([FromODataUri] string name)
{
    // Add try-catch or null 404 handling.

    var site = await this.Repository.GetAsync(new[] { name });

    return site.Locality;
}

显然,将您自己的 DAL 代码放在那里,这只是一个示例。

很明显,这是通过控制器上的简单路由和操作来实现的。

就是说,幕后发生了一些映射。例如,您不能只公开任意导航 属性:

[ODataRoute("({name})/Wangachop")]
public string GetWangachop([FromODataUri] string name)
{
    return "Wangaaa!";
}

会产生:

The path template 'Sites({name})/Wangachop' on the action 'GetWangachop' in controller 'Sites' is not a valid OData path template. Found an unresolved path segment 'Wangachop' in the OData path template 'Sites({name})/Wangachop'.