这就是我正在做的事情:
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,我一直遇到错误......
答案 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
}
}