请问有人能解释一下我何时应该继承我的控制器从 ODataController
而不是 ApiController
?
这个问题是由于 ApiController
返回的结果可以用 OData 查询进行筛选。
如果我将 QueryableAttribute
应用于控制器的方法,即使操作返回 IEnumerable
,查询也会被处理。
但是如果没有这个属性,但调用了 config.EnableQuerySupport()
,只有当方法返回 IQueryable
时才会处理查询。
我认为这是不一致的行为。WebAPI 的文档和示例表明控制器必须继承自 ODataController
。我有点困惑。
要么 ApiController
“意外地”支持了 OData 协议的部分(至少是 $ skip、$filter 和 $top)。要么这是经过设计的,我需要 ODataController 来完整支持 OData。
真正的问题是我的服务公开了 DTO,而不是 POCO。可能没有一对一的映射。需要将针对 DTO 的 OData 查询转换为针对 POCO 的 EF 查询。
现在只是玩 OData。我检索实体并将它们转换为 DTO。诚然,这不是从数据库获取所有实体的性能很好,但对于实验来说是可以容忍的。但如果需要返回客户端的只是一些经过筛选的子集,就绝对没有必要返回所有实体。
使用 ApiController 和 Querayble 属性,OData 查询可以直接工作。但上述不一致性让我觉得自己做错了什么。