.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
vsApiController
问题的原因是,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规范。