按 Parent 考虑的树排序
Order By Tree with Parent Consideration
我在 Kentico 中有这样的文档结构:
- 容器 1
- Child 1
- 容器 2
- Child 2
- 容器 3
- Child 3
- 容器 4
- Child 4
我们目前正在选择所有 "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 的 NodeOrder
或 NodeAliasPath
对数据进行排序。
即使通过 API:
也应该可以执行连接
DocumentNodeDataInfoProvider.GetDocumentNodes()
.Source(sourceItem => sourceItem.Join<DocumentNodeDataInfo>("NodeParentID", "NodeID"))
在与 Kentico 支持人员交谈后,我们提出了一个更简洁的解决方案:
.OrderBy(node => node.Parent.NodeOrder)
在我看来,这似乎是处理此问题的最干净的方法。
我在 Kentico 中有这样的文档结构:
- 容器 1
- Child 1
- 容器 2
- Child 2
- 容器 3
- Child 3
- 容器 4
- Child 4
我们目前正在选择所有 "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 的 NodeOrder
或 NodeAliasPath
对数据进行排序。
即使通过 API:
也应该可以执行连接DocumentNodeDataInfoProvider.GetDocumentNodes()
.Source(sourceItem => sourceItem.Join<DocumentNodeDataInfo>("NodeParentID", "NodeID"))
在与 Kentico 支持人员交谈后,我们提出了一个更简洁的解决方案:
.OrderBy(node => node.Parent.NodeOrder)
在我看来,这似乎是处理此问题的最干净的方法。