2016-03-01 59 views
2

我有類別下面的表。Orderby然後通過使用LINQ

tbCategories

CatgID  CatgName 
------  -------- 
    1   Catg1 
    2   Catg2 
    3   Catg3 
    4   Catg4 

現在我有一個項目表,被分類鏈接到上述類別

tbItem

ItemID   ItemName   ItemCatg   Priority 
------   --------   --------   -------- 
    1    Name 1    1     1 
    2    Name 2    1     2 
    3    Name 3    2     1 
    4    Name 4    3     3 
    5    Name 5    4     2 
    6    Name 6    3     1 

優先

1 - High 
2 - Medium 
3 - Low 

現在,當我顯示該項目的數據,我想與類別Catg1第一顯示項目,Catg2Catg4基於它們的優先級,然後根據它們的優先級與Catg3顯示項目。

我曾試過LINQ表達式,但是我沒有成功。我對LINQSQL的瞭解並不太強,但這是我能達到的程度。

model.items = db.tbItem.OrderBy(p=>p.ItemCatg).ThenBy(p=>p.Priority).ToList(); 

有人能告訴我正確的方法來實現這個功能嗎?

UPDATE

我想實現以下組合同時顯示。

ItemID   ItemName   ItemCatg   Priority 
------   --------   --------   -------- 
    1    Name 1    1     1 
    3    Name 3    2     1 
    2    Name 2    1     2 
    5    Name 5    4     2 
    6    Name 6    3     1 
    4    Name 4    3     3 

回答

2

以下是我過去使用的一個技巧。你基本上依靠比較的結果,首先由非3類(即,假等於0,真等於1),然後按優先級排序,然後按類別排序。

tbItems.OrderBy(p=>p.ItemCatg == 3).ThenBy(p=>p.Priority).ThenBy(p=>p.ItemCatg).ToList(); 

這裏是一個.NET Fiddle的例子。

下面是該示例輸出:

ItemID: 1 ItemName: Name 1 ItemCatg: 1 Priority: 1 
ItemID: 3 ItemName: Name 3 ItemCatg: 2 Priority: 1 
ItemID: 2 ItemName: Name 2 ItemCatg: 1 Priority: 2 
ItemID: 5 ItemName: Name 5 ItemCatg: 4 Priority: 2 
ItemID: 6 ItemName: Name 6 ItemCatg: 3 Priority: 1 
ItemID: 4 ItemName: Name 4 ItemCatg: 3 Priority: 3 
+0

這看起來不錯,但一旦物品已被排序項目與catg1,catg2和catg4必須根據他們的優先級顯示..你可以請暗示,更改..? –

+0

提供的代碼就是這樣做的。你看過這個例子嗎?它應該證明排序,因爲我明白你要求它,所以也許我沒有得到你想要的。 – CaseyR

+1

他只是要求它按優先順序排序,然後按類別排序(除了應該在最下面的Cat 3項目) – Kcoder

1

編輯2:

您可以使用多個查詢這樣的:

var query1 = model.items.Where(x => x.ItemCatg != 3).OrderBy(y => y.Priority); 
var query2 = model.items.Where(x => x.ItemCatg == 3).OrderBy(y => y.Priority); 
var query = query1.Concat(query2); 

編輯:

如果要基於特定的標準組的項目,你可能可以用LINQ做這樣的事情:

model.items = db.tbItem.GroupBy(p=>p.ItemCatg) 
    .OrderBy(p=>p.Priority).ToList(); 

這會根據ItemCatg爲您提供羣組,您可以通過Priority訂購該羣組。

原文:

由於您的查詢是相當定製的,你可以考慮在tbItem您的實際列之間創建一個「映射」 ItemCatg值與您要分配的優先級:

ItemCatg -> Actual priority 
1 -> 0 
2 -> 1 
4 -> 2 //here is the trick 
3 -> 3 

在這種情況下,您可以創建如下映射列表:

List<int> prioMap = new List<int>() { 1, 2, 4, 3 }; 

,然後使用它是這樣的:

model.items = db.tbItem.OrderBy(p=>prioMap.IndexOf(p.ItemCatg)) 
    .ThenBy(p=>p.Priority).ToList(); 

主要的竅門:IndexOf會給你在列表中的項目(ItemCatg)的index

+0

不,我覺得你有我的意思..重點是不是對類項目。但同時顯示的項目我首先需要獲得基於類別的商品和然後根據它們的優先級對它們進行排序。 –

+0

@GuruprasadRao我明白了,好像你在尋找'GroupBy',是嗎? – Ian

+0

噢是的..這可能是正確的方向..你能提供一個解決方案嗎? –