ASP.NET Core 3.0+下使用LINQ对字符串类型数值按数字规则排序
解决方案
- 最优通用方案(无额外改造成本、跨数据库兼容):
PadLeft补0排序的逻辑本质是「先按字符串长度排序,长度相同再按字符串本身排序」,该逻辑可被EF Core原生识别为服务端SQL执行,完全替换原有PadLeft实现,排序效果完全一致:case "Quantity": // 降序排序写法,升序场景可将Descending后缀去掉即可 Items = Items.OrderByDescending(s => s.Quantity.Length) .ThenByDescending(s => s.Quantity); break; - 高性能方案(适用于百万级以上大数据量表):
在数据库新增持久化计算列作为专门的排序字段:- 表结构新增
QuantitySort持久化计算列,逻辑为自动将Quantity左补0到业务最大长度,设置为持久化存储 - 实体映射该字段后直接排序即可,还可对该字段建立索引进一步提升查询性能:
case "Quantity": Items = Items.OrderByDescending(s => s.QuantitySort); break; - 表结构新增
- 自定义规则适配方案(适用于需要特殊排序逻辑的场景):
可直接调用EF Core封装的数据库原生函数生成服务端可执行的SQL,以SQL Server为例:
MySQL、PostgreSQL可直接使用case "Quantity": Items = Items.OrderByDescending(s => EF.Functions.Right(EF.Functions.Replicate("0", maxlen) + s.Quantity, maxlen) ); break;EF.Functions.LPad方法实现同等补0逻辑。
内容的提问来源于stack exchange,提问作者browsermator
相关产品推荐
相关产品推荐

