CostRange方法价格区间条件不生效,如何获取对应价格范围产品?
问题分析与修复方案
原代码核心问题
- 错误使用
Select而非Where:Select是用于提取字段/投影结果的操作,要过滤符合价格区间的产品,必须用Where - 区间判断逻辑错误:用了
||(或)而非&&(且),比如cost > 500 || cost <=2000会匹配所有数值,完全失去区间过滤作用 - 返回值不符合需求:方法返回单个
T类型对象,但你的需求是获取区间内的产品列表,返回类型应改为IEnumerable<T>或List<T> - 重复查询数据库:每个条件分支都重新调用
_context.Set<T>(),效率低下,可先构建查询再统一执行 - 类型不匹配:
cost是int类型,却和500.00这类浮点值比较,金额计算建议统一用decimal类型避免精度丢失
修复后的代码
// 修改返回类型为产品列表 public IEnumerable<T> GetProductsInCostRange(decimal targetCost) { // 先构建基础查询 var query = _context.Set<T>().AsQueryable(); // 用正确的区间判断逻辑 if (targetCost <= 500.00m) { query = query.Where(x => x.Cost <= 500.00m); } else if (targetCost > 500.00m && targetCost <= 2000.00m) { query = query.Where(x => x.Cost > 500.00m && x.Cost <= 2000.00m); } else if (targetCost > 2000.00m && targetCost <= 5000.00m) { query = query.Where(x => x.Cost > 2000.00m && x.Cost <= 5000.00m); } else if (targetCost > 5000.00m && targetCost <= 10000.00m) { query = query.Where(x => x.Cost > 5000.00m && x.Cost <= 10000.00m); } else if (targetCost > 10000.00m) { query = query.Where(x => x.Cost > 10000.00m); } // 执行查询并返回结果 return query.ToList(); }
额外优化建议
- 无需调用
GetByCost(cost),因为方法是根据传入的targetCost确定区间,而非某个产品的价格 - 金额计算优先用
decimal类型,避免浮点精度丢失 - 可将区间阈值抽成常量或配置文件,方便后续修改维护
内容的提问来源于stack exchange,提问作者Egemen32
相关产品推荐
相关产品推荐

