.net – ApiController与ODataController在露出DTO时

前端之家收集整理的这篇文章主要介绍了.net – ApiController与ODataController在露出DTO时前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
当我应该继承我的控制器表单ODataController和ApiController时,有人可以解释我吗?

这个问题是由ApiController返回的结果可以用OData查询过滤的。

如果我将QueraybleAttribute应用于contoller的方法,即使操作返回IEnumerable,查询也被处理。
但是没有这个属性,但是调用config.EnableQuerySupport(),只有当方法返回IQueryable时才会处理查询
我认为这是不一致的行为。 WebAPI documentation and examples意味着控制器必须从ODataController中输出。我有点困惑。
ApiController意外和部分支持部分(至少$ skip,$ filter和$ top)的OData协议。或者这是设计,我需要ODataController来完成ODataSupport。

真正的问题是我的服务暴露了DTO,而不是POCO。可能没有一对一的映射。需要将OData查询重新转换为与POCO的EF查询相对应的DTO。
现在只是和OData玩。我检索实体并将其转换为DTO。诚然,从DB中获取所有这些都不是很好,因为每个请求都是容忍实验的。但是如果需要DTO的一些过滤子集,那么绝对不需要将所有实体返回给客户端。
OData查询开始使用ApiController和Querayble属性开箱即用,但上述不一致会使我做错事情。

解决方法

Can someone explain me when I should inherit my controller form
ODataController vs ApiController?

如果要公开一个遵守OData protocol的端点,则需要从ODataController继承。如果要执行其他操作,例如REST端点,则继承自ApiController。

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

听起来你已经使用了EntityFramework。我知道有许多示例显示如何将其作为OData端点。

如果由于某种原因不想这样做,您可以实现自己的查询。这在this tutorial的几个地方简要介绍,但是要点是添加一个类型为ODataQueryOptions< T>对您的操作,并使用其上的方法过滤您的结果集。但是,为所有可能的OData查询生成好的数据库查询可能会很痛苦,所以如果可能的话应该避免这种情况。

猜你在找的asp.Net相关文章