【问题标题】:OData in .Net Core 2.2 : how to get total number of items?.Net Core 2.2 中的 OData:如何获取项目总数?
【发布时间】:2019-05-20 12:37:44
【问题描述】:

我使用 OData v7.1 创建了一个新的 .NET Core 2.2 Web 应用。

我已经启动并运行它,并且已经可以使用 $top、$skip、...

我现在正试图让 $count 正常工作,但我完全不知道该怎么做。

我已经尝试了几个链接,它们要么不再编译,要么没有产生我想要的结果。

我有什么:

StartUp.cs

app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller}/{action=Index}/{id?}");

                routes.EnableDependencyInjection();
                routes.Expand().Select().OrderBy().Filter().MaxTop(null).Count();
            });

在我的 Controller 类中:

        [EnableQuery]
        [HttpGet("[action]")]
        public IActionResult All()
        {
            var assets = _service.GetAllAssets();
            return Ok(assets);
        }

这将返回所有资产,我可以使用 $top 和 $skip 没问题。现在如何添加 $count=true 或任何其他允许我返回总计数的方法?我究竟做错了什么?

有效的示例网址: http://localhost/api/Assets/All?$top=20&$skip=20

无效的网址: http://localhost/api/Assets/All?$count=true (它返回所有资产)

目前的结果是:

[{Item One}, {Item Two}]

我想要的结果是:

[Count : 4, 
 Items: [{Item One}, {Item Two}
]

【问题讨论】:

  • OData 应该在 IQueryable 之上工作,并根据需要添加 Select、Where 等。我怀疑GetAliases 返回所有项目的列表而不是IQueryable
  • 您是否尝试过ASP.NET Core OData announcement 中的OData 示例,尤其是Query the Resources 示例?
  • Count() 仅适用于列表或数组。您将 count 放在返回单例的 MaxTop(null) 之后。这就是您收到错误的原因。
  • @PanagiotisKanavos :我在发帖之前已经阅读了该页面。问题是这一行:“.MapODataServiceRoute("odata", "odata", GetEdmModel());"。这会产生此错误:“无法将 'Microsoft.AspNet.OData.Routing.ODataRoute' 与 Endpoint Routing 一起使用。”,因为 Endpoint Routing 已成为 .NET Core 2.2 的标准
  • @StevenLemmens 您应该在问题本身中解释这一点。如果路由从 2.0 开始发生了变化,需要改变的是路由和Startup.cs,而不是操作。

标签: c# .net-core odata


【解决方案1】:

你可以这样做:

public IActionResult GetData(ODataQueryOptions<YourType> query)
{
    var data = _context.SetOfYourType;
    return Ok(new
    {
        Items = query.ApplyTo(data),
        Count = query.Count?.GetEntityCount(query.Filter?.ApplyTo(data, new ODataQuerySettings()) ?? data)
    });
}

这基本上产生与使用 PageResult 相同的结果,至少在 $expand、$select 和 $count 方面。

【讨论】:

  • 感谢您提及 ODataQueryOptions - 正是我所需要的。
  • 你救了我的命,谢谢!值得一提的是,仅当查询包含“$count=true”参数时才会填充 Count 属性
【解决方案2】:

你返回错误的类型,往这边走:

    [EnableQuery]
    [HttpGet("[action]")]
    public IQueryable<YourType> All()
    {
        var assets = _service.GetAllAssets(); //Where assets is IQueryable
        return assets;
    }

OData 中间件将为您服务。同样在这种方法中,如果您进行跳过/采取/选择,则会在 SQL 级别上进行评估。

【讨论】:

  • 抱歉,您当然需要在没有 Ok() 的情况下返回资产。我编辑我的答案。
  • 感谢您的编辑,我删除了我最初的评论!
  • 但这并没有什么不同,我现在如何获得我的总数?如果我将 $count=true 添加到我的查询中,它没有任何区别并且返回所有数据?
  • 你对我上一个问题有什么想法吗?我现在如何获得资产总数?像这样调用我的 URL:localhost:xxx/api/Assets/All?$count=true,没有任何作用。如何获得符合我的查询的资产总数?
  • 我遇到了同样的问题,对我来说,将模型类型作为通用参数添加到 IQueryable 为我修复了它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-04
  • 2019-08-29
  • 2020-04-10
  • 1970-01-01
  • 1970-01-01
  • 2020-03-20
  • 1970-01-01
相关资源
最近更新 更多