我在下面列出了类别。
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
和 {的商品{1}} 根据其优先级,然后根据优先级显示 Catg4
项目。
我曾尝试过以下Catg3
表达,但我没有成功。我对LINQ
或LINQ
的了解不是太强,但是我能达到多少。
SQL
有人可以告诉我实现此功能的正确方法吗?
更新
我希望在展示时实现以下组合。
model.items = db.tbItem.OrderBy(p=>p.ItemCatg).ThenBy(p=>p.Priority).ToList();
答案 0 :(得分:2)
以下是我过去使用过的技巧。您基本上依赖于比较的结果,首先按非3类别排序(即,false等于0,真为1),然后是优先级,然后是类别。
/// Custom page not found error handler
app.errorHandler.register { (e:ExpressError) in
switch e {
case .PageNotFound(let path):
return Action<AnyContent>.render("404", context: ["path": path], status: .NotFound)
default:
return nil
}
}
这是一个.NET Fiddle示例。
以下是示例的输出:
tbItems.OrderBy(p=>p.ItemCatg == 3).ThenBy(p=>p.Priority).ThenBy(p=>p.ItemCatg).ToList();
答案 1 :(得分:1)
编辑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
订购。
<强>原始强>
由于您的查询是完全自定义的,因此您可以考虑创建一个&#34;映射&#34;在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
会在列表中为您提供index
项目ItemCatg
。