linq到sql顺序问题

本文关键字:问题 顺序 sql linq | 更新日期: 2023-09-27 18:03:37

我有一个LINQ-to-SQL查询,我在一个名为CustomerReference的nvarchar字段上排序。问题是,以大写字母开头的参考文献似乎是之后没有大写字母,当我需要另一种方式时。例如,如果我有以下行:

d93838
D98484

它现在是按这个顺序排列的,但是我想把它颠倒一下——所以它就像这样

D98484
d93838

有什么想法吗?由于

linq到sql顺序问题

这里假设格式为[A-Za-z]'d+,并将b3432放在C1234之前,B9999之后

list.OrderBy (l => l.CustomerReference.Substring(0,1).ToLower())
    .ThenByDescending(l =>l.CustomerReference.Substring(0,1).ToUpper()==l.CustomerReference.Substring(0,1))
    .ThenBy (l =>l.CustomerReference )

编辑:我也被要求SQL,所以这就是LINQPad所做的

-- Region Parameters
DECLARE @p0 Int SET @p0 = 0
DECLARE @p1 Int SET @p1 = 1
DECLARE @p2 Int SET @p2 = 0
DECLARE @p3 Int SET @p3 = 1
DECLARE @p4 Int SET @p4 = 0
DECLARE @p5 Int SET @p5 = 1
-- EndRegion
SELECT [T0].CustomerReference FROM [dbo].[test] AS [t0]
ORDER BY LOWER(SUBSTRING([t0].[CustomerReference], @p0 + 1, @p1)), 
(CASE 
    WHEN UPPER(SUBSTRING([t0].[CustomerReference], @p2 + 1, @p3)) = SUBSTRING([t0].[CustomerReference], @p4 + 1, @p5) THEN 1
    WHEN NOT (UPPER(SUBSTRING([t0].[CustomerReference], @p2 + 1, @p3)) = SUBSTRING([t0].[CustomerReference], @p4 + 1, @p5)) THEN 0
    ELSE NULL
 END) DESC, [t0].[CustomerReference]

在大多数实现中,小写字母放在前面(这是代码点的顺序排列方式)。您将无法让SQL server更改这一点,因此下一个最好的方法是将其不排序地返回,并编写自定义比较器。请注意,内嵌的。net比较器也将将小写视为第一或相等(与它们的大写等价物相比),这取决于比较器。

然而

!除非您将自己限制在非常简单的示例(ASCII等)中,否则对"相似"字符排序是非常重要的练习。即使我们忽略土耳其语I/İ/br/I,重音字符也会给您带来问题)。