有人可以解释我何时应继承ODataController
和ApiController
的 Controller 形式吗?
问题是由ApiController
返回的结果可以使用OData查询过滤的事实引起的。
如果我将QueraybleAttribute
应用于contoller的方法,即使操作返回IEnumerable
,也会处理查询。
但是,如果没有此属性,但调用config.EnableQuerySupport()
,则仅当方法返回IQueryable
时才处理查询。
我认为这不是一致的行为。 WebAPI documentation and examples表示 Controller 必须从ODataController继承。我有些困惑。ApiController
accidentally
并部分支持OData协议(protocol)的一部分(至少$ skip,$ filter和$ top)。或这是设计使然,我需要ODataController以获得完整的ODataSupport。
真正的问题是我的服务公开了DTO,而不是POCO。可能没有一对一的映射。有必要将OData查询Againts DTO转换为针对POCO的EF查询。
现在只玩OData。我检索实体并将其转换为DTO。诚然,对于每个请求都可以从数据库中获取所有消息,但还不能进行实验,这并不是很有效。但是,如果需要一些经过筛选的DTO子集,则绝对不需要将所有实体返回给客户端。
OData查询开始使用ApiController和Querayble属性开箱即用,但是上述不一致使我做错了事情。
最佳答案
如果要公开遵循OData protocol的端点,则希望从ODataController
继承。如果要执行其他操作(例如REST端点),请从ApiController
继承。
应用WebAPI OData框架的某些部分而不应用其他部分可能不是一个好主意。在某些情况下可能会,但在其他情况下可能效果不佳。例如,您可能会获得查询支持,但是可能不会生成$ metadata端点(这只是推测,实际症状可能有所不同)。
听起来您已经在使用EntityFramework。我知道有许多示例显示如何将其公开为OData端点。
如果由于某种原因不想这样做,则可以实现自己的查询。这是在this tutorial上的几个地方简要介绍的,但是要点是在操作中添加ODataQueryOptions<T>
类型的参数,并使用其上的方法来过滤结果集。但是,为所有可能的OData查询生成良好的数据库查询可能会很痛苦,因此,如果可能,应避免这样做。
关于.net - 公开DTO时的ApiController与ODataController,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18233059/