暴露DTO时ApiController与ODataController

Pav*_*nin 22 .net dto odata asp.net-web-api asp.net-apicontroller

当我继承我的控制器形式ODataControllervs 时,有人能解释我ApiController吗?

问题是由返回的结果ApiController可以使用OData查询过滤的事实引起的.

如果我应用于QueraybleAttribute控制器的方法,即使操作返回,也会处理查询IEnumerable.
但是如果没有此属性但是通过调用config.EnableQuerySupport(),仅在方法返回时才处理查询IQueryable.
我认为这不是一致的行为.WebAPI 文档和示例意味着控制器必须从ODataController中删除.我有点困惑.
任一ApiController accidentally和部分地支撑部分(至少$跳过,$滤波器和$顶部)的OData协议.或者这是设计的,我需要ODataController来完成ODataSupport.

真正的问题是我的服务暴露了DTO,而不是POCO.可能没有一对一的映射.需要将OData查询再次转换为DTO到针对POCO的EF查询.
现在只玩OData.我检索实体并将它们转换为DTO.不可否认,对于每个请求来说,从数据库中获取所有这些数据并不是非常有效,但仍然可以容忍实验.但是,如果它需要一些过滤的DTO子集,则定义上不需要将所有实体返回给客户端.
OData查询开始使用ApiController和Querayble属性开箱即用,但前面提到的不一致使我做错了.

Bri*_*chl 12

有人可以解释我什么时候我应该继承我的控制器形式ODataController vs ApiController?

ODataController如果要公开符合OData协议的端点,您可能希望继承.如果您想要执行其他操作(例如REST端点),则继承ApiController.

应用WebAPI OData框架的某些部分但不应用其他部分可能不是一个好主意.在某些情况下,它可能在其他情况下效果不佳.例如,您可能会获得查询支持,但可能无法生成$ metadata端点(这只是推测,实际症状可能不同).

听起来你已经在使用EntityFramework了.我知道有很多样本显示如何将其公开为OData端点.

如果由于某种原因不想这样做,可以自己实现查询.本教程的一些地方简要介绍了这一点,但要点是在操作中添加类型参数ODataQueryOptions<T>,并使用其中的方法过滤结果集.但是,为所有可能的OData查询生成良好的数据库查询可能会很痛苦,因此如果可能,应该避免这种情况.