多选列表匹配数据库数据:WorkflowStatus枚举查询报错修复
解决多选状态匹配的查询条件错误问题
我一眼就看出问题所在了:你的c.RequestIdStatus是单个WorkflowStatus枚举值,而Report.RequestIdStatus是一个List<WorkflowStatus>集合,直接用==比较当然会报错——这就像拿一个苹果和一筐苹果比相等,编译器肯定懵了。
要解决这个问题,我们需要用集合的Contains方法,检查当前请求的状态是否在用户选中的状态列表里。另外还要考虑一种情况:如果用户没选任何状态,是不是应该返回所有数据?我们可以加个判断来处理这种场景。
修正后的Controller代码如下:
public ActionResult GeneratingReports(ReportViewModel Report) { var requestQuery = _requestServices.GetRequetsForReport().AsQueryable(); // 处理多选状态过滤:如果选中了状态,就过滤出包含这些状态的数据 if (Report.RequestIdStatus != null && Report.RequestIdStatus.Any()) { requestQuery = requestQuery.Where(c => Report.RequestIdStatus.Contains(c.RequestIdStatus)); } var RequestReport = requestQuery.Select(c => new ReportViewModel { RequestCode = c.RequestCode.ToString(), RequestDate = DateHelper.ConvertGregorianToUmAlQura(c.RequestDate, "dd / MM / yyyy"), ComplaintIdType = AppCache.ComplaintTypeName(c.ComplaintIdType), ComplaintAgainstIdType = AppCache.ComplaintAgainstTypeName(c.ComplaintAgainstIdType), RequestStatus = AppCache.RequestStatusName(c.RequestIdStatus), RequestResult = AppCache.RequestRName(c.RequestIdResult), AgencyDocumentationEmployeeId = _requestServices.GetUserFullNameById(c.AgencyDocumentationEmployeeId) }).ToList(); string ReportJson = JsonConvert.SerializeObject(RequestReport); return Content(ReportJson); }
关键修改点:
- 把初始查询转为
IQueryable,这样过滤条件可以延迟执行,提升性能 - 增加空值和空列表判断,避免用户没选状态时出现异常
- 将
Where条件改为Report.RequestIdStatus.Contains(c.RequestIdStatus),判断当前请求的状态是否在选中的列表中
这样修改后,当用户选中[1,2,3](对应New、JusticeWritingUnderProccessing、JusticeWritingReply)时,就能正确筛选出所有状态属于这三个值的数据了。
内容的提问来源于stack exchange,提问作者sara
相关产品推荐
相关产品推荐

