排序方式,然后使用 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

现在,当我显示项目数据时,我希望首先根据优先级显示具有类别Catg1Catg2Catg4的项目,然后根据其优先级显示具有Catg3的项目。

我尝试过LINQ表达方式,但没有成功。我对LINQSQL的了解不是太强,但这就是我能达到的程度。

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

排序方式,然后使用 LINQ

以下是我过去使用过的技巧。 你基本上依赖于比较的结果,首先按非 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