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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 22:02:22