在LINQ中,如何对来自.Include()的数据执行.OrderBy()?

时间:2011-11-16 21:25:37

标签: c# asp.net-mvc linq

这就是我正在做的事情:

List<Category> categories = 
  db.Categories.Include("SubCategories").OrderBy(c => c.Order).ToList();

我的类别表上有一个名为“Order”的列,它只包含一个整数,为表提供某种排序顺序。

我的“子类别”表格中有相同的列...

我想知道在子类别表上添加排序的最简单的解决方案......类似于:

List<Category> categories = 
  db.Categories.Include("SubCategories").OrderBy(c => c.Order)
     .ThenBy(c => c.SubCategories as x => x.Order).ToList();

我想将它保留在这种LINQ格式......(方法格式)......

请记住,我在MVC工作,需要将其作为模型返回到视图中。由于AnonymousTypes,我一直遇到错误......

3 个答案:

答案 0 :(得分:0)

如果Category.SubCategories本身就是一个集合,那么您将无法使用现有的扩展方法进行排序(并且c => c.SubCategories as x => x.Order几乎没有任何转化,基本上说SubCategories是一个Func<SubCategory, bool>

如果你满足于在内存中完成排序(这不应该是一个问题,因为你已经从数据库中取出它们了,如果你没有成千上万的东西)你可以实现您自己的自定义IComparer<Category>会询问每个SubCategories的{​​{1}},以确定在排序操作中是否应将Category置于另一个Category的上方或下方。< / p>

您的陈述将是:

Category

答案 1 :(得分:0)

您可以将单个查询拆分为2个只填充上下文的查询:

IQueryable<Category> categoryQuery = db.Categories.Where(c=> /*if needed*/);
List<Category> categories = categoryQuery.OrderBy(c => c.Order).ToList();
categoryQuery.SelectMany(c => c.SubCategories)
  .OrderBy(sub => sub.Order)
  .AsEnumerable().Count(); // will just iterate (and add to context) all results

您甚至不再需要容易出错的字符串“SubCategories”。

答案 2 :(得分:0)

我不确定这是否得到支持,但这是如何做到的:

List<Category> categories = 
  db.Categories.Include(c => c.SubCategories.OrderBy(s => s.Order)).OrderBy(c => c.Order)

Include方法现在支持这样的表达式,但我不确定它是否也支持排序。

您可能最好在使用它们时对子类别进行排序,可能在您的视图中。

例如:

@for (var cat in Model.Categories) {
   @cat.Name
   @for (var sub in cat.SubCategories.OrderBy(c => c.Order) {
       @sub.Name
   }
}