网站汽车价格区间筛选实现及筛选异常问题咨询
汽车价格区间筛选异常问题排查与修复
问题现象
设置最低价=100,000、最高价=150,000时,筛选结果出现价格超出区间的车辆,同时当前逻辑无法处理仅填写单一价格参数的场景。
核心问题分析
前端侧
用户输入的价格带千分位逗号(如100,000),前端未做处理直接将带逗号的字符串传给后端,导致后端解析decimal时失败,过滤逻辑未生效。
后端侧
- 千分位解析失败:默认
decimal.TryParse不支持带千分符的字符串,导致fromPrice和toPrice解析失败,if条件不满足,过滤逻辑未执行。 - 单一参数场景未处理:仅当两个价格都解析成功时才执行过滤,用户只填最低价或最高价时逻辑失效。
- 重复解析性能差:在
Where中每次循环都调用decimal.Parse(c.price),既影响性能,也存在格式错误风险。
修复方案
前端代码修改
处理输入值中的千分位逗号,转换为纯数字字符串后再传入后端:
onInputChange(event: any, field: string): void { // 移除输入值中的所有逗号,保留纯数字格式 const cleanValue = event.target.value.replace(/,/g, ''); this.filter[field] = cleanValue; }
后端代码修改
支持千分位解析,同时处理单一价格参数的筛选逻辑:
// 需要引入命名空间:using System.Globalization; case "price": var fromPriceString = filters.FirstOrDefault(f => f.Key == "FromPrice")?.Value; var toPriceString = filters.FirstOrDefault(f => f.Key == "ToPrice")?.Value; // 解析最低价,允许千分位和浮点格式 var hasFromPrice = decimal.TryParse( fromPriceString, NumberStyles.AllowThousands | NumberStyles.Float, CultureInfo.InvariantCulture, out var fromPrice ); // 解析最高价,允许千分位和浮点格式 var hasToPrice = decimal.TryParse( toPriceString, NumberStyles.AllowThousands | NumberStyles.Float, CultureInfo.InvariantCulture, out var toPrice ); // 分别处理最低价、最高价的筛选条件 if (hasFromPrice) { query = query.Where(c => decimal.Parse(c.price, NumberStyles.AllowThousands) >= fromPrice); } if (hasToPrice) { query = query.Where(c => decimal.Parse(c.price, NumberStyles.AllowThousands) <= toPrice); } break;
优化建议
数据库字段优化:将c.price的存储类型从字符串改为decimal,彻底避免字符串解析带来的性能问题和格式错误风险,同时简化过滤逻辑。
内容的提问来源于stack exchange,提问作者Ali Zain Khan
相关产品推荐
相关产品推荐

