【问题标题】:Supporting OData Count when using Data Access Layer使用数据访问层时支持 OData Count
【发布时间】:2021-10-15 06:35:33
【问题描述】:

我的 ASP.NET 5 API 站点使用数据访问层(管理器、服务、商店等)从数据库中提取数据。这些层从控制器调用,并将IActionResult 返回给调用者。这些层允许我们将业务规则和其他“后端”逻辑添加到执行的查询中。

添加 ASP.NET OData 后,一切正常除了$count 参数。这是因为,在正常情况下,控制器会返回一个IQueryable<T>,它允许 OData 根据传入的查询参数修改查询并执行它。此执行包括(很可能)第二次执行查询,但未添加 $skip$top,因此总行数可以包含在结果集中。

但是,由于我的 DAL 返回一个IEnumerable<T>(在查询已经执行之后),OData 服务(??ActionFilter??)会生成一个不准确根据给定的集合计数。

请注意,我在控制器中使用ODataQueryOptions<T> 来排除过滤器、跳过和顶部参数,以便将它们传递到不同的数据访问层。

public class MyController : ControllerBase {

   [EnableQuery()]
   public async Task<IActionResult> GetMyStuff(ODataQueryOptions<Stuff> options) {
      // Extract filter, skip, top from ODataQueryOptions

      var x = await _manager.GetStuff(filter, skip, top);

      var count = await _manager.GetCountOfStuff(filter);
      // How do I let OData know what the count value is???

      return Ok(x);
   }

}
}

假设我生成计数值(使用我的 DAL),我的问题最终变成了

我怎样才能让 OData 知道那个值是什么,而不是试图弄清楚它?

【问题讨论】:

  • 您是否尝试过使用 PageResult 而不是 IActionResultnew PageResult&lt;SomeObject&gt;(x, Request.ODataProperties().NextLink, (Int64)count);
  • 我试图与IActionResult 保持一致,所以我可以做return OK(xyz)return NotFound() 之类的事情。

标签: asp.net-web-api odata


【解决方案1】:

这是我自己想出来的。不确定它是什么时候添加的(我不记得几年前我第一次开始使用 MS OData 库时看到过),但是有一个名为 ODataFeature() 的扩展方法来自 Request 对象,它允许您设置一些响应值。

我的代码最终看起来像

public class MyController : ControllerBase {

   [EnableQuery()]
   public async Task<IActionResult> GetMyStuff(ODataQueryOptions<Stuff> options) {
      // Extract filter, skip, top from ODataQueryOptions

      var x = await _manager.GetStuff(filter, skip, top);

      // ****************************************************
      // NEW code to optional inject $count when needed

      if (options.Count?.Value == true) {
         Request.ODataFeature().TotalCount = await _manager.GetCountOfStuff(filter);
      }

      // ****************************************************

      return Ok(x);
   }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-20
    相关资源
    最近更新 更多