OData、Web Api 2以及深度嵌套对象

4

我一直在努力寻找答案,但没有成功。假设我有一个类似于以下模型的模型:

public class A
{
    public int Id {get;set}
    public ICollection<B> Bs {get;set;}
}

public class B
{
    public int Id {get;set}
    public ICollection<C> Cs {get;set;}
}

public class C
{
    public int Id {get;set}
    public string Something {get;set;}
}

我可以编写一个Web Api 2 OData控制器,使其可以像以下方式查询:

/odata/A(1)/B(2)/C(3)/Something

如果这是多余的,请指出我应该查找的地方。谢谢!

3个回答

3

1

(这是一篇旧文章,但它缺少对于新手OData开发人员的一个关键问题的回应)

如果这是多余的,请指出我应该查看的地方

如果类 C 上的 Id 属性是唯一的,则像这样的 URL 路由是多余的。 您操作的资源是 C 的实例,因此在 CController 上定义 Something 操作后,默认 v4 执行 C 资源上的 Something 操作的方法是直接调用 C 资源:

~/odata/C(3)/Something

如果您定义了 Something 操作,则不需要任何自定义的 ODataRouteAttribute。对于 AB 的键应该是多余的,可以从 C 对象中发现。这与许多其他基于 Repo 的 API 模式不同,但重要的是支持我们获得的OOTB标准路由和约定。

虽然您可以编写自己的 URL 路由以匹配您期望的模式,但括号是 OData v4 路由约定中的特殊约定,表示要操作的特定项的键或传递给函数调用的 URL 参数。

请记住,通过故意实现自定义路由,您将使符合标准的客户端难以与您的服务交互,在大多数情况下,采用 OData 的驱动动机是提供符合标准的 API。

如果您真的想要这样的 URL,请建议删除 ()

[ODataRoute("A/({key})/B/{bKey}/C/{cKey}")]

然后,您可以将其定义为绑定到 A 控制器上的操作,该操作还具有除标准 key 参数外的 bKeycKey 参数。


0

一种支持深度导航的传统规则是按照上述钱所描述的方式添加。在OData V4中,您应该能够使用属性路由来支持您的URL。像下面这样在控制器中添加一个路由注释:

[ODataRoute("/A({key})/B({key})/C({key})")]

请注意,官方的WebAPI V4支持将在六月份推出。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接