.Net Core 2.2中的OData:如何获取项目总数?

时间:2019-05-20 12:37:44

标签: c# .net-core 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();
            });

在我的 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}
]

2 个答案:

答案 0 :(得分:3)

您可以这样做:

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

答案 1 :(得分:0)

您输入的类型错误,请按以下方式操作:

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

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