首页 > 解决方案 > .Net Core 2.2 中的 OData:如何获取项目总数?

问题描述

我使用 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();
            });

在我的控制器类中:

        [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}
]

标签: c#.net-coreodata

解决方案


你可以这样做:

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 方面。


推荐阅读