排序方式,然后使用 LINQ
本文关键字:LINQ 然后 方式 排序 | 更新日期: 2023-09-27 18:37:04
我在下表中有类别。
目录
CatgID CatgName
------ --------
1 Catg1
2 Catg2
3 Catg3
4 Catg4
现在我有项目表,它被分类链接到上面的类别
tb项
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();
有人可以告诉我实现此功能的正确方法吗?
更新
我想在显示时实现以下组合。
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
排序。
源语言:
由于查询是高度自定义的,因此可以考虑在实际列ItemCatg
值之间创建一个"映射",tbItem
具有要分配的优先级:
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
。