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

时间:2015-07-01 18:10:20

标签: c# linq-to-sql

我有一个IQueryable<...>对象,它是一个LINQ-to-SQL查询,我试图按字母顺序按名称排序,但字母后面的数字(az,0-9而不是0-9) ,AZ)。例如,列表:

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的任何想法?

2 个答案:

答案 0 :(得分:1)

以下内容应该有效,但需要注意的是修改对象的类或创建新的anonymous type

它实际上在任何不以数字开头的名称之前放置一个空格字符,然后对其进行排序。空格通常在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语句。您可以通过提前预先计算排序名称并将其存储在数据库中然后对其进行排序和索引来更好地解决问题。

答案 1 :(得分:0)

好吧,如果你愿意放弃Contractor部分,你可以做Iqueryable并在内存中完成剩下的工作。

我看到的另一个选择是做双重命令:

第一个Orderby()降序第一个字符 第二个ThenBy()关于整个名字