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,有什么想法吗?

LINQ to SQL查询中字符串值的自定义排序

类似以下内容应该有效,但需要注意的是,您需要修改对象的类或创建一个新的匿名类型。

它本质上是在任何不以数字开头的名称之前加一个空格字符,然后按此排序。在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()