ASP.NET Core 6 Web API过滤搜索异常:仅返回单个对象而非目标列表
问题排查与修复方案
核心问题分析
int类型判断逻辑错误
Argument类的TestId和ExamId是int值类型,默认值为0,string.IsNullOrEmpty(arg.TestId.ToString())永远返回false——int转换为字符串不会是空或空串。这导致筛选条件强制要求匹配TestId和ExamId,直接过滤掉了本该符合条件的数据。代码笔误
查询语句中x.isExamIdNull.Equals(arg.isExamIdNull)是完全错误的写法,误用了逻辑判断变量名,正确写法应该是匹配实体的ExamId属性与参数的ExamId值。
修正后的服务层方法
public IQueryable<Result> GetSByArg(Argument arg) { // 用int默认值0判断是否传入有效筛选值(若业务中0是合法ID,建议改用可空类型) var isTestIdNotSpecified = arg.TestId == 0; var isExamIdNotSpecified = arg.ExamId == 0; var fetch = from x in _dbContext.Repo where (isTestIdNotSpecified || x.TestId == arg.TestId) && (isExamIdNotSpecified || x.ExamId == arg.ExamId) select x; return fetch; }
业务场景优化建议
如果业务中0是TestId或ExamId的合法值,建议将参数类改为可空int类型,避免误判未传入的筛选条件:
public class Argument { public int? TestId { get; set; } public int? ExamId { get; set; } }
对应的服务层判断逻辑调整为:
public IQueryable<Result> GetSByArg(Argument arg) { var isTestIdNotSpecified = !arg.TestId.HasValue; var isExamIdNotSpecified = !arg.ExamId.HasValue; var fetch = from x in _dbContext.Repo where (isTestIdNotSpecified || x.TestId == arg.TestId.Value) && (isExamIdNotSpecified || x.ExamId == arg.ExamId.Value) select x; return fetch; }
内容的提问来源于stack exchange,提问作者Mira
相关产品推荐
相关产品推荐

