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

C# 多参数查询时如何忽略空参数实现动态组合过滤

问题根因

你当前代码无法实现多参数组合过滤的核心原因是使用了else if分支逻辑:只要任意一个前置条件命中,后续的参数判断就会直接跳过,自然只能生效单参数过滤规则。
另外你现在的实现是先把全表数据查询到内存后再做过滤,数据量较大时会有严重性能问题,建议把过滤逻辑放到数据库查询阶段执行。

优化后代码

[HttpGet]
public ActionResult Get(string Id = null, string name = null, string status = null, string startDate = null, string endDate = null)
{
    // 先构造IQueryable查询,此时还未实际执行数据库查询
    IQueryable<ReportModel> query = _context.ReportData.Select(data => new ReportModel
    {
        Id = data.Id,
        Name = data.Plant,
        Status = data.Status,
        Date = data.Date
    });

    // 独立判断每个参数,非空就追加过滤条件,支持多条件叠加
    if (!string.IsNullOrEmpty(name))
    {
        query = query.Where(asd => asd.Name == name);
    }
    if (!string.IsNullOrEmpty(Id))
    {
        query = query.Where(x => x.Id == Id);
    }
    if (!string.IsNullOrEmpty(status))
    {
        query = query.Where(x => x.Status == status);
    }
    // 日期参数处理,先判断非空再做转换追加条件
    if (!string.IsNullOrEmpty(startDate) && DateTime.TryParse(startDate, out DateTime startDt))
    {
        query = query.Where(x => x.Date >= startDt);
    }
    if (!string.IsNullOrEmpty(endDate) && DateTime.TryParse(endDate, out DateTime endDt))
    {
        // 结束日期加1天,实现<=endDate的效果,避免时间精度问题漏掉数据
        query = query.Where(x => x.Date < endDt.AddDays(1));
    }

    // 最后统一排序+执行查询,只返回符合条件的数据
    var report = query.OrderBy(x => x.Id).ToList();
    return Ok(report);
}

实现说明

  • 把所有else if改为独立的if判断,每个非空参数都会追加对应的Where条件,自动实现多参数的AND组合效果
  • 基于IQueryable的延迟查询特性,所有过滤条件会拼接成SQL语句在数据库端执行,避免拉取全表数据到内存过滤,性能提升明显
  • 增加了日期参数的合法性校验,避免非法日期格式导致的程序异常
  • 统一在最后执行排序和查询,避免多次重复排序、ToList的性能损耗
  • 修正了你原代码中属性名大小写不一致的问题,原代码判断条件里写的asd.name和定义的Name属性大小写不一致,避免匹配失败

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 22:48:01