C#中按ShedID筛选Fuel数据无法获取全部详情的技术求助
问题解决:按ShedID获取对应Fuel数据列表
你的代码核心问题是没有执行MongoDB查询并获取实际数据:Find(filter)返回的是IFindFluent查询对象,而非实际的Fuel数据集合,直接返回这个对象会导致Json序列化异常。
修复后的代码
[HttpGet("shed/{id}")] public async Task<IActionResult> Get(int id) { var dbClient = new MongoClient(_configuration.GetConnectionString("FuelQueueAppConnection")); var collection = dbClient.GetDatabase("FuelQueue").GetCollection<Fuel>("Fuel"); // 用强类型属性构建过滤器,避免字符串字段名写错 var filter = Builders<Fuel>.Filter.Eq(f => f.shedId, id); // 执行查询并获取数据列表 var fuelList = await collection.Find(filter).ToListAsync(); if (!fuelList.Any()) { return NotFound($"未找到ShedID为{id}的Fuel数据"); } return Ok(fuelList); }
关键优化点说明
- 执行查询:调用
ToListAsync()(异步)或ToList()(同步)执行查询,获取实际的Fuel数据列表,这样Json序列化才能得到正确的数组结果。 - 异步方法:改用
async Task<IActionResult>替代JsonResult,符合ASP.NET Core异步编程最佳实践,避免阻塞线程。 - 字段匹配校验:如果数据库中字段是
ShedID(大写),而你的Fuel类属性是shedId(小写),需要给属性添加映射特性:public class Fuel { [BsonElement("ShedID")] public int shedId { get; set; } // 其他属性... } - 单例MongoClient优化:MongoClient是线程安全的,建议在Program.cs中注册为单例,避免重复创建连接:
之后在控制器中注入使用即可,不用每次请求都实例化。builder.Services.AddSingleton<IMongoClient>(sp => new MongoClient(builder.Configuration.GetConnectionString("FuelQueueAppConnection"))); - 错误处理:添加
NotFound返回,当没有匹配数据时返回404状态码,更符合REST接口规范。
内容的提问来源于stack exchange,提问作者Deepika
相关产品推荐
相关产品推荐

