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

ASP.NET Core Web API按QR码搜索视频接口始终返回空列表

接口返回空列表排查及修复方案

核心问题点

  1. 路由参数绑定失败
    路由模板写的是[HttpGet("{Qr}")],占位符首字母大写,但Action方法入参是小写的string qr,ASP.NET Core路由参数绑定严格区分参数名大小写,该场景下qr参数会始终被赋值为null,最终生成的SQL查询条件为Machine_Qr = NULL,SQL语法中NULL与任何值都不相等,自然匹配不到数据。
  2. EF Core查询未实际执行,空判断逻辑无效
    Where()方法仅用于组装查询表达式,不会立刻访问数据库,你没有调用ToList()/ToListAsync()等执行方法,且Where()永远不会返回null,写的if (query != null)判断恒成立,完全起不到空值处理的作用。
  3. 外键映射配置错误
    Video实体中[ForeignKey("Machine")]指定的导航属性名是Machine,但实际定义的导航属性是小写开头的public Machine machine { get; set; },名称不匹配会导致EF Core外键关联映射异常。
  4. 异步方法逻辑不完整
    方法标记了async Task<>返回值,但内部没有使用await调用异步方法,会产生编译警告,同时异步执行流程不规范。

修复步骤

  • 统一路由占位符和入参名称,推荐遵循C#小驼峰参数命名规范,将路由特性修改为[HttpGet("{qr}")]
  • 修正实体导航属性命名,和ForeignKey标注的名称保持一致,符合C#大驼峰属性命名规范:
// Video实体修正部分
[ForeignKey ("Machine")]
public string Machine_Qr { get; set; }
// 导航属性改为大驼峰命名
public Machine Machine { get; set; }
public Coache Coache { get; set; }
  • 重写控制器Action逻辑,补充参数校验、查询执行、关联属性加载逻辑,修复后代码如下:
[HttpGet("{qr}")]
public async Task<IActionResult> Search(string qr)
{
    if (string.IsNullOrWhiteSpace(qr))
    {
        return BadRequest("QR码参数不能为空");
    }
    // 若不需要返回关联的Machine、Coache数据,可以去掉对应的Include语句
    var matchVideos = await _context.videos
        .Include(v => v.Machine)
        .Include(v => v.Coache)
        .Where(v => v.Machine_Qr == qr)
        .ToListAsync();

    return Ok(matchVideos);
}

额外排查项

如果修复后仍返回空,检查以下两点:

  • 确认数据库Video表中Machine_Qr字段存储的值和你传入的QR码完全一致,注意排查是否存在前后隐藏空格、大小写差异(数据库排序规则区分大小写时,大小写不一致会匹配失败)
  • 确认数据库上下文_context的连接字符串配置正确,连接的是你预期的业务数据库,而不是开发环境的空测试库。

注:Machine实体中的InsertedOn是公共字段而非属性,EF Core不会自动映射该字段,不影响本次查询逻辑,若需要持久化该字段记得改成带{get;set;}的属性。

内容的提问来源于stack exchange,提问作者Gazdallah Amira

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 16:01:08