[英]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
現在,當我顯示項目數據時,我希望首先根據其優先級顯示類別Catg1
, Catg2
和Catg4
的項目,然后根據其優先級顯示Catg3
的項目。
我曾嘗試在LINQ
表達式下進行操作,但沒有成功。 我對LINQ
或SQL
知識不是很強,但是我可以達到的水平。
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.