如何在导航(子)属性上应用排序?

时间:2018-03-12 13:03:03

标签: c# linq entity-framework-core

此查询将返回类别列表(及其包含的产品,但产品与此问题无关)。 ParentId == null的类别将按SortOrder排序,但Children类别则不会。据我了解,这不可能直接使用LINQ实现,但可以通过编程方式“post query”完成。

如何?

查询:

List<ProductCategory> DbCategories = _context.ProductCategories
                        .Include(e => e.Children)
                        .Include(e => e.ProductInCategory)
                            .ThenInclude(p => p.Product)
                        .ToList().OrderBy(o => o.SortOrder)
                        .Where(e => e.ParentId == null).ToList();

结果以无序列表递归显示,如下所示:

<ul>
  <li>
    Id=1,SortOrder=1,ParentId=null (sorted)
  </li>
  <li>
    Id=2,SortOrder=2,ParentId=null (sorted)
  </li>
  <li>
    Id=3,SortOrder=3,ParentId=null (sorted)
    <ul>
      <li>
        Id=4,SortOrder=2,ParentId=3 (not sorted)
      </li>
      <li>
        Id=5,SortOrder=3,ParentId=3 (not sorted)
      </li>
      <li>
        Id=6,SortOrder=1,ParentId=3 (not sorted)
        <ul>
          <li>
            <!-- ... and so on... nothing gets sorted further on either. -->
          </li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

2 个答案:

答案 0 :(得分:1)

您可以遍历子列表(在初始查询之后)对每个列表进行排序:

DbCategories.ForEach(cat => cat.Children = cat.Children.OrderBy(c => c.SortOrder).ToList());

编辑:这是其他实体的附加示例行:

DbCategories.ForEach(prod =>
{
  prod.ProductInCategory = prod.ProductInCategory.OrderBy(p => p.SortOrder).ToList();
  prod.ProductInCategory.ForEach(pr => pr.Product = pr.Product.OrderBy(p => p.SortOrder).ToList());
});

答案 1 :(得分:0)

试试吧。

{{1}}