.NET Core Web API空参数时如何实现Like模糊查询?
解决方案
当然可以实现,你需要动态构建查询条件,同时注意参数类型的适配(比如companyId是int类型,无法直接接收空值,需要改为可空类型int?)。以下是修改后的完整代码:
public async Task<List<Inventory>> GetInventoryList(int? companyId, string userName, int page, int pageSize) { IQueryable<Inventory> query = _context.Inventories; // 处理CompanyId条件:有值则精确匹配,空则执行模糊查询(此处针对int类型转字符串实现数字模糊匹配,若需求是不限制则可省略else分支) if (companyId.HasValue) { query = query.Where(x => x.CompanyId == companyId.Value); } else { // 转字符串后实现模糊匹配,相当于SQL中的 LIKE '%'(匹配所有),若需特定模糊规则可修改空字符串为目标值 query = query.Where(x => x.CompanyId.ToString().Contains("")); } // 处理UserName条件:有值则精确匹配,空则执行模糊查询(匹配Responsible字段的所有内容) if (!string.IsNullOrEmpty(userName)) { query = query.Where(x => x.Responsible == userName); } else { // 避免null引发异常,先判断字段非空再执行模糊匹配,若需包含null值可改为 x.Responsible == null || x.Responsible.Contains("") query = query.Where(x => x.Responsible != null && x.Responsible.Contains("")); } // 排序 query = query.OrderByDescending(x => x.CreatedDate); // 获取总条数(需在分页前执行,确保总数正确) int totalCount = await query.CountAsync(); // 分页并投影返回结果 var response = await query.Skip(pageSize * (page - 1)) .Take(pageSize) .Select(x => new Inventory() { CompanyId = x.CompanyId, CreatedDate = x.CreatedDate, Barcode = x.Barcode, BrandId = x.BrandId, BusinessCode = x.BusinessCode, CategoryId = x.CategoryId, CategorySubId = x.CategorySubId, Id = x.Id, Imei = x.Imei, InventoryDate = x.InventoryDate, InvoiceDate = x.InvoiceDate, Mac = x.Mac, ModelId = x.ModelId, Name = x.Name, SerialNumber = x.SerialNumber, Status = x.Status, Responsible = x.Responsible, TotalCount = totalCount, UpdatedDate = x.UpdatedDate }).ToListAsync(); return response; }
关键说明:
- 参数类型修改:将
companyId改为int?(可空整数),这样就能接收空参数(前端不传值或传null时)。 - 动态条件构建:
- 对于
companyId:有值时直接精确匹配字段;空值时将数字转字符串后执行模糊匹配(若你的需求是空值时不限制该字段,直接删除else分支即可)。 - 对于
userName:有值时精确匹配Responsible字段;空值时执行模糊匹配(Contains("")等价于SQL的LIKE '%%',会匹配所有非空的Responsible值,若需包含null可调整条件)。
- 对于
- 总条数计算时机:必须在
Skip和Take之前执行CountAsync,否则得到的是分页后的条数而非总数据量。
内容的提问来源于stack exchange,提问作者fatihgun
相关产品推荐
相关产品推荐

