用于LINQ中的字母数字数据的Express SQL OrderBy子句

时间:2016-09-29 08:09:54

标签: c# sql-server linq sorting alphanumeric

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

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似乎排序为字符串,但忽略了数值前的减号。

我正在使用带有LINQ的C#来对字符串进行排序以尝试匹配该排序:

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会对所有负值首先按升序排序,然后是零,然后是正值

有关如何获得所需排序以复制SSRS排序的任何想法?

注意

我在此报告列中有其他类型的字符串,这些字符串已正确排序。 e.g。

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

2 个答案:

答案 0 :(得分:2)

我想LINQ这里你指的是常规的LINQ to对象,而不是实体框架或LINQ to 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

答案 1 :(得分:1)

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

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

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