ASP.NET Core Web API按QR码搜索视频接口始终返回空列表
接口返回空列表排查及修复方案
核心问题点
- 路由参数绑定失败
路由模板写的是[HttpGet("{Qr}")],占位符首字母大写,但Action方法入参是小写的string qr,ASP.NET Core路由参数绑定严格区分参数名大小写,该场景下qr参数会始终被赋值为null,最终生成的SQL查询条件为Machine_Qr = NULL,SQL语法中NULL与任何值都不相等,自然匹配不到数据。 - EF Core查询未实际执行,空判断逻辑无效
Where()方法仅用于组装查询表达式,不会立刻访问数据库,你没有调用ToList()/ToListAsync()等执行方法,且Where()永远不会返回null,写的if (query != null)判断恒成立,完全起不到空值处理的作用。 - 外键映射配置错误
Video实体中[ForeignKey("Machine")]指定的导航属性名是Machine,但实际定义的导航属性是小写开头的public Machine machine { get; set; },名称不匹配会导致EF Core外键关联映射异常。 - 异步方法逻辑不完整
方法标记了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
相关产品推荐
相关产品推荐

