【发布时间】: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而不是IActionResult?new PageResult<SomeObject>(x, Request.ODataProperties().NextLink, (Int64)count); -
我试图与
IActionResult保持一致,所以我可以做return OK(xyz)或return NotFound()之类的事情。
标签: asp.net-web-api odata