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 版本信息

调用接口地址: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
相关产品推荐
相关产品推荐

