2016-09-29 16 views
4

字母数字数据快速SQL排序依据子句我有一个SQL Server报表服务正在使用SQL order by排序,并返回字母数字字符串数据如下(SSRS)报告:在LINQ

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默认排序的所有负值先刺升序,然后是零,然后是正值

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

注意

我在那些正确排序本报告列其他类型的字符串。 例如

"Timestamp: data time data" 
"Identifier: string data" 
+1

我刚刚在Linqpad上试过这个作为字符串的列表,并将它命令为你正在寻找的。 由于我不能复制你的问题,我需要更多的信息。如何填充说明,并且可以展示更多代码以显示填充内容的类型以及其中 –

+0

为我们提供了更多代码的类。你的代码应该基于你给我们的数据 –

回答

2

我想LINQ在这里意思是指定期的LINQ to objects,而不是Entity Framework或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 
+0

感谢您的解决方案Evk。 我也有套管问题,所以我用“StringComparer.InvariantCultureIgnoreCase”,它解决了我的套管和排序问题。 – Mike

1

正如你可以看到你的字符串按字母顺序排序。这里没有魔法。 289.64之前30.99。如果你想按字符串中的数字排序,你应该提取这些数字。您可以使用正则表达式,但简单Substring应该在这里做的工作,因为所有的字符串有号码前相同的前缀:

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

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

+0

我想用默认比较器(比如InvariantCulture)更好。 – Evk

+0

@Evk我不确定是否只有减号是OP排序的问题。您的解决方案仍然会在'30.99'之前返回'289.64',而忽略数字值。 –

+0

但是OP不需要数字排序 - 他需要与SQL查询返回一样的排序,并且此解决方案提供了这一点。 – Evk