【发布时间】:2013-08-16 11:36:49
【问题描述】:
谁能解释我什么时候应该继承我的控制器表单ODataController vs ApiController?
问题是因为ApiController返回的结果可以用OData查询过滤。
如果我将QueraybleAttribute 应用于控制器的方法,即使操作返回IEnumerable,也会处理查询。
但是,如果没有此属性但调用 config.EnableQuerySupport(),则仅当方法返回 IQueryable 时才会处理查询。
我认为这不是一致的行为。 WebAPI documentation and examples 暗示控制器必须从 ODataController 中初始化。我有点困惑。ApiControlleraccidentally 和部分支持 OData 协议的一部分(至少 $skip、$filter 和 $top)。或者这是设计使然,我需要 ODataController 来获得完整的 ODataSupport。
真正的问题是我的服务公开了 DTO,而不是 POCO。可能没有一对一的映射。需要将针对 DTO 的 OData 查询转换为针对 POCO 的 EF 查询。
现在只是玩 OData。我检索实体并将它们转换为 DTO。诚然,对于每个请求从数据库中获取所有这些请求的性能并不是很好,但对于实验却是可以容忍的。但是,如果它需要一些过滤的 DTO 子集,则绝对不需要将所有实体返回给客户端。
OData 查询开始使用 ApiController 和 Querayble 属性开箱即用,但前面提到的不一致让我觉得我做错了。
【问题讨论】:
-
我认为这是因为它实现了其他功能,例如允许使用 WCF 数据服务客户端的元数据:sravi-kiran.blogspot.co.nz/2013/08/…、blogs.msdn.com/b/webdev/archive/2013/01/29/…、asp.net/web-api/overview/odata-support-in-aspnet-web-api。 Web API(带查询支持)于 2012 年 1 月发布,Web API OData 于 2013 年 1 月发布,所以我认为“我需要 ODataController 来获得完整的 ODataSupport”以匹配 OData 规范是正确的。
标签: .net asp.net-web-api odata dto asp.net-apicontroller