C# Orderby,然后使用LINQ

C# Orderby,然后使用LINQ,c#,asp.net-mvc,linq,C#,Asp.net Mvc,Linq,我有下表的类别 tbCategories CatgID CatgName ------ -------- 1 Catg1 2 Catg2 3 Catg3 4 Catg4 现在我有一个items表,它被分类链接到上面的分类 tbItem ItemID ItemName ItemCatg Priority ------

我有下表的类别

tbCategories

CatgID        CatgName
------        --------
  1           Catg1
  2           Catg2
  3           Catg3
  4           Catg4
现在我有一个items表,它被分类链接到上面的分类

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
expression,但没有成功。我在
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

编辑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);
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();
编辑:

如果您想根据某些标准对项目进行分组,您可能可以使用LINQ执行以下操作:

model.items = db.tbItem.GroupBy(p=>p.ItemCatg)
   .OrderBy(p=>p.Priority).ToList();
这将为您提供基于
ItemCatg
的组,并在该组中按
优先级进行排序

原件:

<> P>由于您的查询是完全自定义的,您可以考虑在您的实际列中的“代码> > ITEMCATG/<代码>值之间创建一个“映射”,其中您希望分配的优先级是:

ItemCatg -> Actual priority
1 -> 0
2 -> 1
4 -> 2 //here is the trick
3 -> 3
在这种情况下,您可以创建如下映射列表:

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);
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
)的
索引。

以下是我过去使用的技巧。您基本上依赖于比较的结果,首先按非3个类别(即,false等于0,true等于1)排序,然后按优先级排序,然后按类别排序

tbItems.OrderBy(p=>p.ItemCatg == 3).ThenBy(p=>p.Priority).ThenBy(p=>p.ItemCatg).ToList();
这里有一个例子

下面是示例的输出:

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

不,我想你弄错了。。优先权针对的是项目,而不是类别。。但是,在显示项目时,我首先需要根据类别获取项目,然后根据其优先级对其进行排序。@GuruprasadRao我明白了,似乎您正在寻找
GroupBy
,是吗?哦,是的。。这可能是正确的方向。。你能提供一个解决方案吗?在这个组中,我怎么能只考虑3个小组按他们的优先级排序?太好了!我的解决方案是使用多个查询,然后使用concat来避免复杂的单个查询。但很高兴您已经得到了答案。:)这看起来不错,但一旦项目被分类,catg1、catg2和catg4的项目必须根据其优先级显示。。你能暗示一下变化吗?提供的代码就是这样做的。你看过这个例子了吗?它应该显示排序,因为我理解你要求它,所以可能我没有得到你想要的东西。他只是要求它在分类之前按优先级排序(第3类项目除外,应该在底部)现在得到了-我更新了小提琴本身和输出,以反映这一变化。是的,感谢@Kcoder的澄清,我也逐字逐句地读了这篇文章:-)