C# Orderby,然后使用LINQ
我有下表的类别 tbCategoriesC# 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 ------
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的澄清,我也逐字逐句地读了这篇文章:-)