Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NETCore2.2中的OData:如何获取项目总数?_C#_.net Core_Odata - Fatal编程技术网

C# NETCore2.2中的OData:如何获取项目总数?

C# NETCore2.2中的OData:如何获取项目总数?,c#,.net-core,odata,C#,.net Core,Odata,我使用ODataV7.1创建了一个新的.NETCore2.2Web应用程序 我已经启动并运行了它,并且已经可以使用$top、$skip、 我现在正试图让$count正常工作,但我完全不知道该怎么做 我已经尝试了以下几个链接,它们要么不再编译,要么不产生我想要的结果 我所拥有的: 在StartUp.cs中 app.UseMvc(routes => { routes.MapRoute( name:

我使用ODataV7.1创建了一个新的.NETCore2.2Web应用程序

我已经启动并运行了它,并且已经可以使用$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,或任何其他允许我同时返回总计数的方法?我做错了什么

有效的示例url: ?$top=20和$skip=20

不起作用的Url: ?$count=true (它返回所有资产)

目前的结果是:

[{Item One}, {Item Two}]

我期望的结果是:

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

如果返回的类型错误,请按以下方式操作:

    [EnableQuery]
    [HttpGet("[action]")]
    public IQueryable<YourType> All()
    {
        var assets = _service.GetAllAssets(); //Where assets is IQueryable
        return assets;
    }
[启用查询]
[HttpGet(“[action]”)
公共IQueryable All()
{
var assets=_service.GetAllAssets();//其中资产是可查询的
归还资产;
}
OData中间件将为您提供休息。同样在这种方法中,如果您使skip/take/select在SQL级别进行评估。

您可以这样做:

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)
    });
}
public IActionResult GetData(ODataQueryOptions查询)
{
var data=_context.SetOfYourType;
返回Ok(新的
{
Items=query.ApplyTo(数据),
Count=query.Count?.GetEntityCount(query.Filter?.ApplyTo(数据,新ODataQuerySettings())??数据)
});
}

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

OData应该在IQueryable上工作,并根据需要添加Select、Where等。我怀疑
getAlias
返回的是所有项目的列表,而不是
IQueryable
您是否尝试了中的OData示例,尤其是
查询资源的示例?Count()仅适用于列表或数组。将count放在MaxTop(null)之后,后者返回一个单例。这就是为什么你会得到一个错误。@PanagiotisKanavos:我在这里发布之前已经阅读了那一页。问题是这一行:“.MapODataServiceRoute”(“odata”,“odata”,GetEdmModel());”。这会产生以下错误:“无法将“Microsoft.AspNet.OData.Routing.ODataRoute”与端点路由一起使用。”,因为端点路由已成为.NET Core 2的标准。2@StevenLemmens你应该在问题本身中解释这一点。如果路由自2.0以来发生了更改,则需要更改的是路由和
Startup.cs
,而不是操作。很抱歉,您当然需要返回不带Ok()的资产。我编辑了我的答案。谢谢你的编辑,我删除了我最初的评论!但这并没有什么区别,我现在如何得到我的总数?如果我将$count=true添加到我的查询中,则没有任何区别,所有数据都将返回?您对我的最后一个问题有什么想法吗?我现在如何获得资产总数?像这样调用我的URL:,没有任何作用。我如何获得符合我的查询的资产总数?我有同样的问题,对我来说,将模型类型作为通用参数添加到IQueryable中修复了meThanks提到ODataQueryOptions的问题-这正是我所需要的。