按 Parent 考虑的树排序

Order By Tree with Parent Consideration

我在 Kentico 中有这样的文档结构:

我们目前正在选择所有 "Child" 文档,然后按 NodeLevel、NodeOrder、NodeName 排序。这导致 children 按 NodeName(按字母顺序)排序的列表,因为它们都具有等效的 NodeLevel 和 NodeOrder。

有没有一种方法可以考虑到它们的容器来对它们进行排序?我们希望它们的顺序是 Child 1, Child 2, Child 3, Child 4.

更新:我应该早点提到我们正在使用 Kentico 的 MVC 应用程序。因此,我没有直接查询数据库,而是使用 Kentico 提供的文档提供程序。这限制了我使用与 DocumentQuery objects 和 LINQ 表达式关联的方法。

您可以在 OrderBy 子句中执行类似的操作:

CASE WHEN NodeLevel == 1 THEN NodeName ELSE '' END

所以这将在您的 ORDER BY 属性 中。正在做的是检查节点级别,如果文档的节点级别 = 1,则它将按 NodeName 对其进行排序,否则不会对其进行排序。这将只订购 NodeLevel 1 项目。

看到类似的回答我posted here

我想您可以使用 NodeParentID:

加入页面(文档)
SELECT t1.[NodeID]
      ,t1.[NodeAliasPath]
      ,t1.[NodeName]
      ,t1.[NodeAlias]
      ,t1.[NodeParentID]
      ,t1.[NodeLevel]
      ,t1.[NodeOrder]
      ,t2.[NodeAliasPath] AS [ParentPath]
      ,t2.[NodeOrder] AS [ParentOrder]
      ,t2.[NodeLevel] AS [ParentLevel]
  FROM [CMS_Tree] t1
  INNER JOIN [CMS_Tree] t2 ON
  t1.[NodeParentID] = t2.[NodeID]
  ORDER BY [ParentOrder]

并使用 parent 的 NodeOrderNodeAliasPath 对数据进行排序。

即使通过 API:

也应该可以执行连接
DocumentNodeDataInfoProvider.GetDocumentNodes()
  .Source(sourceItem => sourceItem.Join<DocumentNodeDataInfo>("NodeParentID", "NodeID"))

在与 Kentico 支持人员交谈后,我们提出了一个更简洁的解决方案:

.OrderBy(node => node.Parent.NodeOrder)

在我看来,这似乎是处理此问题的最干净的方法。