2010-09-28 58 views
1

我基本上有一張表頭,我用C#中的linq讀取數據庫中的表頭。在這些標題中,總是至少有一個總是相同的;總計,我希望它總是在正確的位置。Linq OrderBy屬性值和組

因此,這裏是那種我的數據是如何佈局:

Data 
{ 
    Label, 
    Value, 
    Age //Not used initially 
} 

樣本數據:

{"Dog", 7} 
{"Cat", 3} 
{"Other", 4} 
{"Total", 14} 

我想在這個以命令標籤;實際的動物名稱按降序排序,總數被追加到最後:

"Dog", "Other", "Cat", "Total" 

如何在Linq中執行此操作。我如何根據另一個屬性的值來排序屬性?

一旦我有了標題的順序,是否有一種簡單的方法可以根據已經確定的順序對未來的行進行排序。如果我想最初找到標題(x => x.Age> 20) 如何根據與> 20集合相同的順序將標籤排序在哪裏(x => x.Age < = 20)?

+0

你爲什麼總存儲?無法計算它,然後只是添加到列表的末尾?然後你可以按年齡降序排序。或者我錯過了什麼? – jim 2010-09-28 22:35:46

+0

其簡化。總數不是實際的屬性名稱。並不總是可以通過求和來計算。 – Harry 2010-09-28 23:15:12

回答

4

這個查詢應該工作:

var query = from row in table 
      let ignore = row.Label == "Total" 
      orderby ignore, row.Value descending 
      select row.Label; 

//and corresponding lambda version 
var lquery = table.OrderBy(row => row.Label == "Total") 
        .ThenByDescending(row => row.Value) 
        .Select(row => row.Label); 

注意:它不是完全必要創建一個ignore變量,它可以直接在排序依據子句中放置。這樣,它使它更具可讀性。

不確定你在問你第二個問題。


編輯:
在回答您的意見,這將取決於你如何想的分揀工作,至少這樣寫的。如果表中只有一行需要完全忽略,那麼這很有效。如果你有不止一個,那就不要多說了。問題是,在「被忽略」的行中,將按原始排序排序(在這種情況下,按Value)。添加另一行的天真方式是添加到忽略條件。

var query = from row in table 
      let ignore = row.Label == "Total" || row.Label == "Cost" 
      orderby ignore, row.Value descending 
      select row.Label; 

要具備「忽略」行中的特定的順序,這需要一個較爲複雜的查詢:

var query = from row in table 
      let ignore = row.Label == "Total" || row.Label == "Cost" 
      let ignoreorder = row.Label == "Cost" ? 1 : 0 
      orderby ignore, ignoreorder, row.Value descending 
      select row.Label; 

//and corresponding lambda version 
var lquery = table.OrderBy(row => row.Label == "Total" || row.Label == "Cost") 
        .ThenBy(row => row.Label == "Cost" ? 1 : 0) 
        .ThenByDescending(row => row.Value) 
        .Select(row => row.Label); 
+0

如果我有超過1個「忽略」列,語法會是什麼樣子。像總數和成本。我總是希望Cost在被忽略之後。另外,這個樣子的lambda表達式語法是什麼樣的?這解決了我的第一個問題。謝謝。我會研究第二個問題,也許在另一個問題上進一步澄清。 – Harry 2010-09-28 23:52:26