LINQ中没有按预期排序的字母数字数据的SQL order子句

本文关键字:数字 SQL 子句 order 数据 排序 LINQ | 更新日期: 2023-09-27 18:09:18

我有一个SQL Server Reporting Services (SSRS)报告,该报告使用SQL order by排序并返回以下字母数字字符串数据:

Value: 0.0
Value: 20.96
Value: 289.64
Value: 30.99
Value: 308.655
Value: -32296.32
Value: 34.844
Value: 38.95
Value: -697.38
Value: -703.48

每个字符串有以下格式:

`Value: numeric data`

SQL order by似乎按字符串排序,但忽略了数值前的减号。

我正在使用c#和LINQ对字符串进行排序,以尝试匹配排序:

var _sorted = _unsortedValues.OrderBy(x => x.Description);

:

Value: -32296.32
Value: -697.38
Value: -703.48
Value: 0.0
Value: 20.96
Value: 289.64
Value: 30.99
Value: 308.655
Value: 34.844
Value: 38.95

LINQ默认对字符串进行排序,所有的负值先升序排列,然后是0,然后是正值

对于如何获得所需的排序来复制SSRS排序有什么想法吗?

注意

我在这个报告列中有其他类型的字符串被正确排序。例如

"Timestamp: data time data"
"Identifier: string data"

LINQ中没有按预期排序的字母数字数据的SQL order子句

我想你这里的LINQ是指常规的LINQ到对象,而不是实体框架或LINQ到sql。字符串如何排序取决于所使用的比较器,您可以将您喜欢的比较器传递给OrderBy语句。例如,要获得你想要的排序,你可以这样做:

var sorted = _unsortedValues.OrderBy(x => x.Description, StringComparer.InvariantCulture).ToArray();

返回与SQL语句相同的顺序。

同时,如果您将使用另一个比较器,如:

var sorted = _unsortedValues.OrderBy(x => x.Description, StringComparer.Ordinal).ToArray();

您将得到与问题中相同的顺序(首先是负数)。

为什么你得到了你得到的顺序,而其他人却不能复制?这是因为默认情况下使用CurrentCulture字符串比较器,不同的机器可能会有不同的当前文化,所以人们得到不同的结果。

var sorted = _unsortedValues.OrderBy(x => x.Description, StringComparer.CurrentCulture).ToArray(); // this is what is done by default

您可以看到您的字符串按字母顺序排序。这里没有魔法。289.6430.99之前。如果您希望按字符串中的数字排序,则应该提取这些数字。您可以使用Regex,但简单的Substring应该可以在这里工作,因为所有字符串在number之前都有相同的前缀:

var startIndex = "Value: ".Length;
var _sorted = _unsortedValues
                .OrderBy(x => Double.Parse(x.Description.Substring(startIndex)));

注意:考虑去掉服务器端的Value:前缀,因为它不提供任何实际数据。