2016-09-29 15 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