LINQ-to-SQL 查询中字符串值的自定义排序
Custom ordering of string values in LINQ-to-SQL query
我有一个 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
有任何想法吗?
好吧,如果你愿意放弃Iqueryable
部分,你可以做一个.ToList()
,剩下的记在心里。
我看到的另一个选择是进行双重排序:
First Orderby() 按第一个字符降序排列
整个名称上的第二个 ThenBy()
像下面这样的东西应该可以工作,但需要注意的是您需要修改对象的 class 或创建一个新的 anonymous type.
它本质上是在任何不以数字开头的名称之前放置一个 space 字符,然后对其进行排序。在 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<...>
对象,它是一个 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
有任何想法吗?
好吧,如果你愿意放弃Iqueryable
部分,你可以做一个.ToList()
,剩下的记在心里。
我看到的另一个选择是进行双重排序:
First Orderby() 按第一个字符降序排列 整个名称上的第二个 ThenBy()
像下面这样的东西应该可以工作,但需要注意的是您需要修改对象的 class 或创建一个新的 anonymous type.
它本质上是在任何不以数字开头的名称之前放置一个 space 字符,然后对其进行排序。在 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
语句,因此可能会出现一些严重的性能问题。您可以通过提前预先计算排序名称并将其存储在数据库中然后对其进行排序和索引来更好地解决问题。