ASP.NET Core Web API:Get方法多设施参数过滤返回空列表问题
问题分析与修复
你的代码存在两个核心问题,直接导致返回空列表:
1. 查询条件逻辑完全错误
业务方法里的p.Facilities.Contains(facilities.ToString())逻辑不成立——你把传入的设施集合直接转成了类似"System.Collections.Generic.List1[YourNamespace.Facilities]"`的字符串,数据库中不可能有套餐的设施字段匹配这个内容,自然查不到结果。
根据你“获取包含指定设施的套餐”的需求,分两种常见场景修正:
场景A:套餐需要包含所有传入的设施
public IEnumerable<GetPackageDto> GetPackagesByFacilities(IEnumerable<Facilities> facilities) { var facilitiesList = facilities.ToList(); // 筛选出包含所有传入设施的套餐 var packages = _context.Packages .Where(p => facilitiesList.All(f => p.Facilities.Contains(f))) .ToList(); return _mapper.Map<List<GetPackageDto>>(packages); }
场景B:套餐只需包含至少一个传入的设施
public IEnumerable<GetPackageDto> GetPackagesByFacilities(IEnumerable<Facilities> facilities) { var facilitiesList = facilities.ToList(); // 筛选出包含任意一个传入设施的套餐 var packages = _context.Packages .Where(p => facilitiesList.Any(f => p.Facilities.Contains(f))) .ToList(); return _mapper.Map<List<GetPackageDto>>(packages); }
2. 冗余的空值判断
packages == null的判断完全多余——ToList()方法即使没有匹配结果,也会返回空列表而非null,所以业务方法永远不会返回null,控制器里的NotFound()也永远不会触发。直接移除冗余代码:
修正后的控制器端点:
[HttpGet("facilities")] public ActionResult GetPackageByFacilities([FromQuery]IEnumerable<Facilities> facilities) { var packages = _packageManagement.GetPackagesByFacilities(facilities); return Ok(packages); }
3. 请求参数格式验证
确保调用接口时Query参数格式正确。假设Facilities是枚举类型(比如有Gym、Pool等值),请求URL需写成:
GET /你的接口路径/facilities?facilities=Gym&facilities=Pool
这样ASP.NET Core才能正确将多个facilities参数绑定到IEnumerable<Facilities>。
内容的提问来源于stack exchange,提问作者el halcon
相关产品推荐
相关产品推荐

