gpt4 book ai didi

.net - 公开 DTO 时的 ApiController 与 ODataController

转载 作者:行者123 更新时间:2023-12-03 11:42:49 25 4
gpt4 key购买 nike

谁能解释我什么时候应该继承我的 Controller 表单ODataController对比 ApiController ?

问题是由 ApiController 返回的结果引起的。可以使用 OData 查询进行过滤。

如果我申请 QueraybleAttribute对于 Controller 的方法,即使操作返回 IEnumerable 也会处理查询.
但是没有这个属性,而是调用 config.EnableQuerySupport() , 仅当方法返回 IQueryable 时才处理查询.
我认为这不是一致的行为。 WebAPI documentation and examples暗示 Controller 必须从 ODataController 中初始化。我有点困惑。ApiController accidentally并部分支持 OData 协议(protocol)的一部分(至少 $skip、$filter 和 $top)。或者这是设计使然,我需要 ODataController 来获得完整的 ODataSupport。

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

最佳答案

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



你会想要继承 ODataController如果你想公开一个遵守 OData protocol 的端点.如果您想做其他事情,例如 REST 端点,则从 ApiController 继承.

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

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

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

关于.net - 公开 DTO 时的 ApiController 与 ODataController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18233059/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com