C# API按KlantId查询仅返回1行数据问题排查求助
问题原因分析
你的代码只返回1行数据的核心原因是:
- 仓储层
GetDataById方法使用了FirstOrDefaultAsync,这个方法仅会返回满足条件的第一条数据,而非所有匹配记录。 - 控制器层接收单个
MachineModel对象,最终也只会映射并返回单个DTO。
另外注意:API模型中KlantId是字符串类型(值为"1"),但方法参数传入的是int id,如果MachineModel中的KlantId也是字符串类型,直接用x.KlantId == id可能因类型不匹配导致筛选逻辑异常(EF可能做隐式转换,但建议显式处理避免潜在问题)。
解决方案
1. 修改仓储层代码
将方法改为返回所有匹配KlantId的记录:
public class MachineRepository: IRepository<MachineModel> { private readonly DataContext _context; public MachineRepository(DataContext context) { _context = context; } // 修改为返回列表 public async Task<List<MachineModel>> GetMachinesByKlantId(int id) { // 若KlantId是字符串类型,转为字符串后比较 return await _context.Machine.Where(x => x.KlantId == id.ToString()).ToListAsync(); // 若KlantId是int类型,直接用x.KlantId == id即可 // return await _context.Machine.Where(x => x.KlantId == id).ToListAsync(); } }
2. 修改控制器层代码
调整逻辑接收列表并映射为DTO列表返回:
[ApiController] [Route("api/Machine")] [Produces("application/json")] public class MachineController : ControllerBase { private readonly IRepository<MachineModel> _repo; private readonly IMapper _mapper; public MachineController(IRepository<MachineModel> repo, IMapper mapper) { _repo = repo; _mapper = mapper; } [HttpGet("{id}")] public async Task<IActionResult> GetMachinesByKlantId(int id) { Console.WriteLine("传入的Id: " + id); var models = await _repo.GetMachinesByKlantId(id); return Ok(_mapper.Map<List<MachineDto>>(models)); } }
3. 同步修改IRepository接口
确保接口中添加对应方法定义:
public interface IRepository<T> { // 其他方法... Task<List<MachineModel>> GetMachinesByKlantId(int id); }
修改完成后,请求api/Machine/1即可返回所有KlantId匹配的记录。
内容的提问来源于stack exchange,提问作者Minimumspace
相关产品推荐
相关产品推荐

