LINQ to SQL查询中字符串值的自定义排序
本文关键字:自定义 排序 字符串 to SQL 查询 LINQ | 更新日期: 2023-09-27 18:00:45
我有一个IQueryable<...>
对象,它是一个LINQ to SQL查询,我试图按名称按字母顺序排序,但数字在字母后面(a-z,0-9而不是0-9,a-z)。例如,列表:
1st Street
Zeta
2nd Street
Alpha
应按以下方式订购:
Alpha
Zeta
1st Street
2nd Street
目前我有以下代码:
IQueryable<...> holdings = ...;
/* ... */
return holdings.OrderBy(q => q.Name);
但这项订单的项目如下:
1st Street
2nd Street
Alpha
Zeta
关于如何以所需方式订购这款IQueryable
,有什么想法吗?
类似以下内容应该有效,但需要注意的是,您需要修改对象的类或创建一个新的匿名类型。
它本质上是在任何不以数字开头的名称之前加一个空格字符,然后按此排序。在SQL排序中,空格通常在数字之前排序。
holdings.Select(h => new {
name = h.name,
/* copy all other fields you need here */
// select a new field specifically for ordering.
orderingName = SqlMethods.Like(q.name, "[^0-9]%") ? " " + q.name : q.name
}).OrderBy(q => q.orderingName);
我敢肯定,由于将生成CASE
语句,可能会出现一些严重的性能问题。通过提前预计算排序名称并将其存储在数据库中,然后对其进行排序和索引,您可能可以更好地解决这个问题。
好吧,如果你愿意放弃Iqueryable
部分,你可以做一个.ToList()
,然后在内存中完成其余部分。
我看到的另一个选择是双重订购:
从第一个字符开始降序排列的First Orderby()整个名称上的第二个ThenBy()