You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core API中OData使用$count=true无返回总数的解决方法

问题描述

使用ASP.NET Core Web API + EF Core(代码优先)结合OData进行数据库交互,调用带$count=true参数的接口时,仅返回JSON数据列表,未返回记录总数信息。相关代码与环境如下:

控制器代码

public class EquipmentController : ODataController
{
    [HttpGet]
    [EnableQuery]
    public ActionResult<IQueryable<Equipment>> GetAllEquipmentsList()
    {
        IQueryable<Equipment> list = _sqlServerContext.Equipments
            .Include(x => x.CostCenter)
            .Include(x => x.EquipmentCategory)
            .Include(x => x.equipmentType)
            .AsQueryable();

        return Ok(list);
    }
}

Program.cs 配置代码

builder.Services
       .AddControllers()
       .AddOData(options => options.Select().Filter().OrderBy().Count().Expand().SetMaxTop(null));

OData 版本信息

OData 版本信息

调用接口地址:http://localhost:5000/api/Equipment/GetAllEquipmentsList?$count=true


修复方案

1. 调整控制器方法返回类型与EnableQuery配置

将方法返回类型改为直接返回IQueryable<Equipment>,并在[EnableQuery]中显式开启计数允许:

public class EquipmentController : ODataController
{
    [HttpGet]
    [EnableQuery(AllowCount = true)]
    public IQueryable<Equipment> GetAllEquipmentsList()
    {
        return _sqlServerContext.Equipments
            .Include(x => x.CostCenter)
            .Include(x => x.EquipmentCategory)
            .Include(x => x.EquipmentType); // 修正变量名首字母大写,符合C#命名规范
    }
}

2. 配置OData实体模型(关键步骤)

在Program.cs中添加OData实体模型的构建与注册,确保OData能正确识别你的实体集:

builder.Services.AddControllers().AddOData(options =>
{
    // 保留原有查询配置
    options.Select().Filter().OrderBy().Count().Expand().SetMaxTop(null);
    
    // 构建OData模型
    var modelBuilder = new ODataConventionModelBuilder();
    modelBuilder.EntitySet<Equipment>("Equipment");
    modelBuilder.EntitySet<CostCenter>("CostCenters");
    modelBuilder.EntitySet<EquipmentCategory>("EquipmentCategories");
    modelBuilder.EntitySet<EquipmentType>("EquipmentTypes");
    
    // 注册模型到指定路由前缀
    options.AddRouteComponents("api", modelBuilder.GetEdmModel());
});

3. 改用OData标准路由(可选)

如果使用OData默认的实体集路由(将方法名改为Get()),请求URL更符合OData规范,计数功能稳定性更高:

public class EquipmentController : ODataController
{
    [EnableQuery(AllowCount = true)]
    public IQueryable<Equipment> Get()
    {
        return _sqlServerContext.Equipments
            .Include(x => x.CostCenter)
            .Include(x => x.EquipmentCategory)
            .Include(x => x.EquipmentType);
    }
}

此时请求URL改为:http://localhost:5000/api/Equipment?$count=true


内容的提问来源于stack exchange,提问作者Alex Wright

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 18:35:28