Entity Framework Core 如何根据输入的filter参数添加条件Where子句?
问题根本原因
你原有写法的逻辑存在缺陷:Where条件中所有子句均通过&&关联,当filter为null或者filter.deptId为空时,filter != null && ... s.deptId == filter.deptId这一整段会返回false,导致所有行都不满足过滤条件,最终查询结果为空。
解决方案
将过滤逻辑调整为**「过滤参数无效时直接跳过该条件,参数有效时才执行匹配」**,在Where表达式内可以用||实现该逻辑,完全不需要额外写if判断,正确写法如下:
public List<MyViewModel> GetRecords(SearchDto? filter) { var results = this.dbContext.MyTable .Where(s => s.IsActive == "Y" // filter为空、filter.deptId为空时,该段条件返回true,不限制部门 && (filter == null || string.IsNullOrEmpty(filter.deptId) || (!string.IsNullOrEmpty(s.deptId) && s.deptId == filter.deptId))) .ToList(); }
多过滤条件叠加写法
如果有多个过滤字段,直接按相同规则叠加条件即可,示例:
public List<MyViewModel> GetRecords(SearchDto? filter) { var results = this.dbContext.MyTable .Where(s => s.IsActive == "Y" // 部门过滤 && (filter == null || string.IsNullOrEmpty(filter.deptId) || (!string.IsNullOrEmpty(s.deptId) && s.deptId == filter.deptId)) // 名称模糊过滤 && (filter == null || string.IsNullOrEmpty(filter.Name) || s.Name.Contains(filter.Name)) // 状态精确过滤 && (filter == null || filter.Status == null || s.Status == filter.Status)) .ToList(); }
该写法完全兼容LINQ to SQL、EF/EF Core,会被正确翻译为SQL语句在数据库端执行,不会产生内存过滤的性能问题。
内容的提问来源于stack exchange,提问作者c0micrage
相关产品推荐
相关产品推荐

