首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LINQ-to-SQL orderby问题

LINQ-to-SQL orderby问题
EN

Stack Overflow用户
提问于 2011-07-26 10:03:39
回答 2查看 325关注 0票数 2

我有一个LINQ查询,我在一个名为CustomerReference的nvarchar字段上排序。问题是,引用以大写字母开头似乎是在没有大写字母的后面,而我需要的是大写字母。例如,如果我有以下行:

代码语言:javascript
复制
d93838
D98484

它现在是按这个顺序排列的,但是我需要它倒过来--所以它应该是这样的

代码语言:javascript
复制
D98484
d93838

伙计们有什么想法吗?谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-07-26 10:06:07

这将采用after \d+格式,并将b3432放在C1234之前,但在B9999之后

代码语言:javascript
复制
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所做的

代码语言:javascript
复制
-- 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]
票数 4
EN

Stack Overflow用户

发布于 2011-07-26 10:08:44

在大多数实现中,小写是第一位的(尤其是这样,代码点是按顺序排列的)。您将无法让SQL server对其进行更改,因此下一步最好的方法是将其重新排序,并编写一个自定义比较器。请注意,内置的.NET比较器也将根据比较器的不同,将小写视为第一或等于(与其大写等效)。

不过!除非您将自己限制在非常简单的示例(ASCII等)上,否则排序“相似”字符是一个非常重要的练习。即使我们忽略土耳其I/İ/ı/ i,重音字符也会给您带来问题)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6828371

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档