【问题标题】:Asp.net Core OData using pagination cant seem to find how to get total record count使用分页的 Asp.net Core OData 似乎无法找到如何获取总记录数
【发布时间】:2019-08-07 22:52:28
【问题描述】:

我正在尝试使用 OData 进行分页,但返回的数据集似乎没有被查询的完整集合的总数。

我在一些问题中查看了 SO - here、here 和 C# Corner 有 this 关于使用 Asp.Net Core 的 OData 的教程。

当您进行分页时,我的理解是您需要指定开始和跳过以及总项目数等。从我正在阅读的内容来看,Asp.net Core OData 没有inlinecount作为查询选项。

如果是这种情况,您究竟如何获得页面集的总项目数?

我在 startup.cs 中有以下内容:

        app.UseMvc(routeBuilder => {
            routeBuilder.EnableDependencyInjection();
            routeBuilder.Expand().Select().OrderBy().Filter().MaxTop(null).Count().Expand();

我的控制器中有:

   [HttpGet("Index", Name = "ClientIndex")]
   [EnableQuery()]
    public IQueryable<Client> GetClients() {
        return _context.Clients;
    }

目前的查询是:

http://localhost:57500/#clients/clientsList?$top=10&$orderby=ClientNo asc,ClientLastName asc,MobilePhone asc

所以,为了成功实现分页,我需要数据库表中的总记录,但您似乎无法获得此值作为响应..

【问题讨论】:

    标签: asp.net-core odata


    【解决方案1】:

    使用 $count 而不是 $inlinecount。

    回复如下:

    朋友,请访问此链接https://www.odata.org/getting-started/basic-tutorial/#count 以了解更多信息。

    这是一个示例。希望能帮到你,我的朋友:))

    安装包 Microsoft.AspNetCore.OData -Version 7.1.0

    --模型--

    public class Product
        {
            public int ID { get; set; }
            public string Name { get; set; }
        }
    

    --控制器--

    public class ProductsController : ODataController
        {
            private List<Product> products = new List<Product>()
            {
                new Product()
                {
                    ID = 1,
                    Name = "Bread",
                },
                new Product()
                {
                    ID = 2,
                    Name = "Tomato",
                },
                new Product()
                {
                    ID = 3,
                    Name = "Lemon",
                },new Product()
                {
                    ID = 4,
                    Name = "Orange",
                }
            };
    
            [EnableQuery]
            public List<Product> Get()
            {
                return products;
            }
        }
    

    --启动---

    public void ConfigureServices(IServiceCollection services)
            {
                services.AddMvc(option => 
                {
                    option.EnableEndpointRouting = false;
                }).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);            
                services.AddOData();
            }
    
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
            {
                if (env.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                }
                else
                {
                    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
                    app.UseHsts();
                }            
    
                var builder = new ODataConventionModelBuilder(app.ApplicationServices);
    
                builder.EntitySet<Product>("Products");
    
                app.UseMvc(routeBuilder =>
                {                
                    routeBuilder.Select().Expand().Filter().OrderBy().MaxTop(100).Count();
                    routeBuilder.MapODataServiceRoute("ODataRoute", "odata", builder.GetEdmModel());                
                    routeBuilder.EnableDependencyInjection();
                });            
    
            }
    

    【讨论】:

    • 感谢您的回复。我已经尝试过了,它确实返回了计数,但在这种情况下,如果我说前 10 条记录计数返回数据库中整个集合中的 10 条而不是 30 条。为了进行分页,我需要记录总数而不是返回数据中的记录数。实际上,该页面说“请求响应中资源中包含的匹配资源的计数。”..所以我需要表中的总项目,例如客户端。
    • @si2030:嗨,我的朋友。可以发一下你的case吗?因为当我运行请求时:localhost:44352/odata/…,它确实返回了整个集合的值。
    • 这是我使用的查询:'localhost:57500/api/client/… asc,ClientLastName asc,MobilePhone asc'。仍然没有得到 totalItemCount。这是因为 Asp.net Core 无法提供此选项吗?
    • @si2030:嗨,我的朋友。我使用带有 .Net core 2.2 的 Web Api 作为示例。 Asp.net Core 确实支持获取总数。您能否发布一张显示您的请求响应的图片?看我上面的照片。
    • @si2030:如果您的任务非常必要,您可以将代码推送到 github。所以我可以提供更好的帮助,我的朋友 :))
    猜你喜欢
    • 1970-01-01
    • 2023-02-15
    • 2015-01-23
    • 2021-11-17
    • 1970-01-01
    • 2012-05-24
    • 2020-04-18
    • 2017-09-28
    相关资源
    最近更新 更多