ASP.NET MVC中参数为null时如何省略.Where()对应筛选条件
实现方法
直接把分类筛选的判断逻辑合并到Where子句中即可,利用布尔逻辑短路特性实现条件筛选,不需要拆分查询语句,也不需要额外写if分支。
修改后的完整代码:
public List<PostIndexResponse> GetPosts(string search, int? categoryId) { var currentUserId = HttpContext.Current.User.Identity.GetUserId() ?? ""; var srch = search ?? ""; var posts = _set.Where(x => x.PersonId.Contains(currentUserId) && x.Description.Contains(srch) && (!categoryId.HasValue || x.CategoryId == categoryId.Value) ).OrderByDescending(x => x.CreatedOn).ToList(); return posts; }
逻辑解释
- 当传入的
categoryId为null时,!categoryId.HasValue返回true,逻辑或运算会直接短路,后续的分类ID相等判断不会执行,这部分条件恒成立,不会对结果做分类过滤。 - 当
categoryId有具体值时,!categoryId.HasValue返回false,会继续执行后续的x.CategoryId == categoryId.Value判断,只返回匹配对应分类的内容。
如果你使用EF/EF Core这类ORM框架,这个写法可以被正常翻译为参数化SQL,不会触发客户端评估,生成的SQL会自动包含
@categoryId IS NULL OR [CategoryId] = @categoryId的判断,执行效率和手写分支查询完全一致。
内容的提问来源于stack exchange,提问作者ELOL
相关产品推荐
相关产品推荐

