.net 暴露DTO时ApicController与ODataController的比较

.net 暴露DTO时ApicController与ODataController的比较,.net,asp.net-web-api,odata,dto,asp.net-apicontroller,.net,Asp.net Web Api,Odata,Dto,Asp.net Apicontroller,有人能告诉我什么时候我应该继承我的控制器表单ODataControllervsApiController 问题的原因是,ApiController返回的结果可以通过OData查询进行过滤 如果我将queryableAttribute应用于contoller的方法,即使操作返回IEnumerable,也会处理查询 但是,如果没有此属性,但使用调用config.EnableQuerySupport(),则仅当方法返回IQueryable时才会处理查询 我认为这是不一致的行为。WebAPI意味着控制器

有人能告诉我什么时候我应该继承我的控制器表单
ODataController
vs
ApiController

问题的原因是,
ApiController
返回的结果可以通过OData查询进行过滤

如果我将
queryableAttribute
应用于contoller的方法,即使操作返回
IEnumerable

,也会处理查询 但是,如果没有此属性,但使用调用
config.EnableQuerySupport()
,则仅当方法返回
IQueryable

时才会处理查询 我认为这是不一致的行为。WebAPI意味着控制器必须从ODataController初始化。我有点困惑。
ApiController
意外地
并部分支持OData协议的一部分(至少$skip、$filter和$top)。或者这是设计的,我需要ODataController来提供完整的ODataSupport

真正的问题是我的服务公开了DTO,而不是POCO。可能没有一对一映射。需要将针对DTO的OData查询转换为针对POCO的EF查询。
现在只是和小田玩。我检索实体并将其转换为DTO。诚然,对于每一个请求,从数据库中获取所有这些请求对于实验来说还不是很有效。但是,如果客户机需要一些经过过滤的DTO子集,则无需将所有实体返回给客户机
OData查询开始使用ApiController和queryable属性开箱即用,但前面提到的不一致性让我觉得我做错了什么

有人能告诉我什么时候应该继承控制器表单吗 ODataController和ApicController

如果要公开依附于ODataController的端点,则需要从ODataController继承。如果要执行其他操作,例如REST端点,则从
ApiController
继承

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

听起来您已经在使用EntityFramework了。我知道有很多示例展示了如何将其公开为OData端点


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

这很好地解释了这些差异:

谢谢。我改变了问题的措辞。希望它变得更清晰。我认为如果你在自己的目录中分开你的控制器可能是个好主意。例如,在控制器文件夹中创建API文件夹和OData文件夹。使用OData的一个优点是,您不必为每个请求项创建新的硬编码linq查询;它对于查询单个实体(不是连接的实体)非常有用。查询url会自动为您生成linq表达式。通过消除添加新linq查询的需要,您可以避免项目的代码维护和开销。我将使用ApicController处理复杂的连接实体关系,使用OData处理简单的单实体关系。我认为这是因为它实现了元数据等附加功能,允许使用WCF Data Services客户端:。Web API(带查询支持)于2012年1月发布,Web API OData于2013年1月发布,因此我认为您的“我需要ODataController提供完整的ODataSupport”是正确的,以符合OData规范。