【问题标题】:OData in ASP.NET Core, pagination with total number of records in a table (Metadat missing)ASP.NET Core 中的 OData,使用表中的记录总数进行分页(缺少元数据)
【发布时间】:2021-03-17 21:37:32
【问题描述】:

我在我的 asp.net core3.1 应用程序中使用 OData,以及将分页委托给客户端的内容。我被困在如何返回给定条目数的日志,即表中的条目总数。例如,有一个包含 100 个条目的表,我希望能够获取此信息以准确了解如何创建我的页面组件。

服务注册

services.AddOData();

配置

app.UseEndpoints(endpoints =>
{
    endpoints.MapDefaultControllerRoute();
    endpoints.EnableDependencyInjection();
    endpoints.Expand().Select().Count().Filter().OrderBy().SkipToken().MaxTop(20);
});

这是终点

[HttpGet]
[EnableQuery]
[Produces("application/json")]
public IActionResult Get()
{
    var query = dbContext.Users;

    return Ok(query);
}

我正在使用这个查询 -

https://localhost:1234/api/users?$count=true&$select=id,name,version&$skip=0&$top=5

仅输出 5 个对象的列表,没有额外的元数据。

[
   {
      Id: "1",
      Name: "a",
      Version: "1"
   },
   ... 4 more objects
]

【问题讨论】:

  • 您应该向我们展示结果的 sn-p,该 URL 应该包含结果
  • 我的答案中包含了一个证明,但是您的控制器逻辑会对此产生很大影响,因此您也应该将其包含在您的帖子中。
  • @ChrisSchaller,我已经用所有缺失的信息更新了问题

标签: c# asp.net-core odata asp.net-core-odata


【解决方案1】:

$count=true 表示总体计数将在响应中:

GET: ~/OData/Employees/Summaries?$count=true&$top=10&$skip=10
{
    "@odata.context": "~/odata/$metadata#EmployeeSummaryDTOs(Contact())",
    "@odata.count": 29,
    "value": [
        {
            "Id": 15097,
            "Title": "Miss Mavis MOPPIT",
    ...

我们实际上可以稍微作弊来证明这一点,如果我们取 $top 0 记录,仍然返回计数:

GET: ~/OData/Employees/Summaries?$count=true&$top=0
{
    "@odata.context": "~/odata/$metadata#EmployeeSummaryDTOs(Contact())",
    "@odata.count": 29,
    "value": []
}

这当然依赖于默认或通过控制器,您的控制器方法将需要返回一个IQueryable 表达式,以便自动解析$count。

默认实现会将$filter 应用于您的表达式,然后将$count 解析为单独的数据库查询,然后在检索最终结果时应用分页Take/Skip 逻辑。

如果您自己处理请求,那么您也需要管理该逻辑。

【讨论】:

  • 在我这边,第二个 odata 表达式产生一个空数组,而第一个产生一个包含 N 个元素的数组
猜你喜欢
  • 1970-01-01
  • 2019-09-07
  • 2015-07-19
  • 2023-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-18
  • 1970-01-01
相关资源
最近更新 更多