Ordering menu nodes by parent, previous and next id

I have a small menu that I would like to order by the identifier of the database table as follows:

public class Obj { public string Value { get; set; } public int? ParentNodeId { get; set; } public int? PreviousNodeId { get; set; } public int? NextNodeId { get; set; } } private IEnumerable<MenuNodeDTO> GetSortedMenuNodes(int menuId) { var nodes = LoadMenuNodes(menuId); foreach (MenuNode menuNode in nodes .Where(s => s.MenuItemId == null && s.ParentNodeId == null) .OrderBy(x => x?.PreviousNodeId) .Where(x => x.PreviousNodeId != x.Id)) { MenuNodeDTO tmpMenuNode = new MenuNodeDTO(); tmpMenuNode.MenuNodeDtoId = menuNode.Id; tmpMenuNode.MenuItemCode = menuNode.MenuItem?.Code; tmpMenuNode.ChildMenuNodes = GetChildNodes(menuNode).ToList(); tmpMenuNode.MenuSettings = GetMenuSettings(menuNode).ToList(); yield return tmpMenuNode; } } 

Example:

 Id = 1 MainMenuPoint1 ParentNodeId = null, PreviousNodeId = null, NextNodeId = 4 Id = 2 -> 1 ChildNodeFromPoint1 ParentNodeId = 1, PreviousNodeId = null, NextNodeId = null Id = 3 --> ChildNodeFromFirstChildNode1 ParentNodeId = 2, PreviousNodeId = null, NextNodeId = null Id = 4 MainMenuPoint2 ParentNodeId = null, PreviousNodeId = 1, NextNodeId = null 

The problem with mine for everyone is that when changing the identifier, the order does not work. Does anyone have an idea how to sort by parentid, previousid and next id, which check every time all identifiers for relations?

+5
source share
1 answer
  private IEnumerable<MenuNodeDTO> GetSortedNodes(Menu menu, MenuNode node) { List<MenuNodeDTO> items = new List<MenuNodeDTO>(); var nodes = node != null ? node.ChildMenuNodes : menu.MenuNodes; var nextNode = node == null ? nodes.Where(c => c.PreviousNodeId == null && c.ParentNodeId == null).FirstOrDefault() : nodes.Where(c => c.ParentNodeId == node.Id && c.PreviousNodeId == null).FirstOrDefault(); while (nextNode != null) { MenuNodeDTO tmpMenuNode = new MenuNodeDTO(); tmpMenuNode.MenuNodeDtoId = nextNode.Id; tmpMenuNode.MenuItemCode = nextNode?.MenuItem?.Code; tmpMenuNode.ChildMenuNodes = this.GetSortedNodes(menu, nextNode).ToList(); tmpMenuNode.MenuSettings = GetMenuSettings(nextNode).ToList(); items.Add(tmpMenuNode); if (!nextNode.NextNodeId.HasValue) break; nextNode = nextNode.NextNode; } return items; } 
+1
source

Source: https://habr.com/ru/post/1260068/


All Articles