时间:2011-07-26 10:03:39

标签: c# linq linq-to-sql

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

d93838
D98484

它目前按顺序排列,但我需要它反转 - 所以它就像这样

D98484
d93838

任何想法的家伙?感谢

2 个答案:

答案 0 :(得分:4)

这假定格式为[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]

答案 1 :(得分:1)

在大多数实现中,小写首先出现(尤其是,代码点通常是如此排列的)。您将无法让SQL服务器更改它,因此下一个最好的方法是将其取回未排序,并编写自定义比较器。请注意,内置的.NET比较器将小写视为第一个或相等(与大写的大写相比),具体取决于比较器。

然而!除非你将自己局限于非常简单的例子(ASCII等),否则命令“相似”字符是一项非常重要的练习。即使我们忽略土耳其语I /İ/ı/ i,重音字符也会导致问题。)