Orderby然后使用LINQ

时间:2016-03-01 17:05:26

标签: c# asp.net-mvc linq

我在下面列出了类别。

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表达,但我没有成功。我对LINQLINQ的了解不是太强,但是我能达到多少。

SQL

有人可以告诉我实现此功能的正确方法吗?

更新

我希望在展示时实现以下组合。

model.items = db.tbItem.OrderBy(p=>p.ItemCatg).ThenBy(p=>p.Priority).ToList();

2 个答案:

答案 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