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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 13:45:32