簡體   English   中英

Orderby,然后使用LINQ

[英]Orderby and thenby using 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

現在,當我顯示項目數據時,我希望首先根據其優先級顯示類別Catg1Catg2Catg4的項目,然后根據其優先級顯示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

以下是我過去使用的技巧。 您基本上是依靠比較結果的,首先是按非3類別(即false等於0,true等於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

編輯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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM