Заказ по дереву с учетом родителей

У меня есть такая структура документа в Kentico:

  • Container 1
    • Child 1
  • Container 2
    • Child 2
  • Container 3
    • Child 3
  • Container 4
    • Child 4

В настоящее время мы выбираем все «дочерние» документы, а затем сортируем их по NodeLevel, NodeOrder, NodeName. В результате получается список дочерних элементов, отсортированных по NodeName (в алфавитном порядке), поскольку все они имеют эквивалентные NodeLevel и NodeOrder.

Есть ли способ отсортировать их с учетом их контейнера? Мы хотим, чтобы они были в порядке Ребенок 1, Ребенок 2, Ребенок 3, Ребенок 4.

Обновление: я должен был упомянуть ранее, что мы используем приложение MVC с Kentico. Таким образом, я не делаю прямых запросов к базе данных, а использую поставщиков документов, предоставляемых Kentico. Это ограничивает меня использованием методов, связанных с объектами DocumentQuery и выражениями LINQ.


person Eric R    schedule 24.04.2017    source источник


Ответы (3)


Я думаю, вы могли бы присоединиться к страницам (документам), используя 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]

И закажите данные, используя родительские NodeOrder или NodeAliasPath.

Должна быть возможность выполнить соединение даже через API:

DocumentNodeDataInfoProvider.GetDocumentNodes()
  .Source(sourceItem => sourceItem.Join<DocumentNodeDataInfo>("NodeParentID", "NodeID"))
person rocky    schedule 25.04.2017
comment
Спасибо, @роки. Я должен был упомянуть, что мы используем решение Kentico MVC и не делаем прямых вызовов БД. Извините за путаницу. - person Eric R; 25.04.2017

Вы можете сделать что-то подобное в своем предложении OrderBy:

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

Так что это будет в вашем свойстве ORDER BY. Что делается, так это проверяет уровень узла, если уровень узла документа = 1, тогда он будет сортировать его по NodeName, иначе он не будет сортировать его. Это закажет только элементы NodeLevel 1.

См. аналогичный ответ, который я опубликовал здесь< /а>

person Brenden Kehren    schedule 24.04.2017
comment
Извините, я должен был указать, что мы используем поставщиков документов, поскольку наш сайт является сайтом MVC, который извлекает свое содержимое из Kentico, поэтому я не делаю прямой запрос к базе данных. - person Eric R; 25.04.2017
comment
Вы все еще можете иметь это в своем предложении OrderBy с DocumentQueries. - person Brenden Kehren; 25.04.2017
comment
Правильно, я спрашиваю, каким должно быть предложение OrderBy для этого. - person Eric R; 25.04.2017
comment
Я разместил это в своем ответе. Order By CASE WHEN NodeLevel == 1 THEN NodeName ELSE '' END - person Brenden Kehren; 25.04.2017
comment
О... прости, Бренден. Я смотрел на свой телефон и не видел исходного ответа, только комментарий. Это крутой ответ. Я попробую. Спасибо! - person Eric R; 25.04.2017

Поговорив со службой поддержки Kentico, мы пришли к более чистому решению:

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

На мой взгляд, это казалось самым чистым способом справиться с этим.

person Eric R    schedule 26.04.2017