5
我有一个小菜单,我想通过数据库表中的id类似下面的命令:顺序菜单节点
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;
}
}
例子:
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
与我的每个问题是,当id改变了排序不起作用。 有人知道如何通过parentid,previousid和next id命令来检查每次所有关系的ID吗?
至于我,我会建议另一个数据库结构:'ParentNodeId'和'Order'。你可以使用DFS来订购你的节点,并且可以使用Order来订购叶子。顺序也不能保证是明显的,节点1的所有子项都可以有顺序= 0 - 这意味着它们应该按名称\ ID \排序,无论如何,这并不重要。 –
@YeldarKurmangaliyev问题在于当你改变菜单结构,移动节点或删除节点时,你会怎么做? –
谈论顺序,移除或移动一个节点什么也不会改变 - 它工作得很好。谈到父母关系,如果它有子节点,你就无法删除一个节点。这是数据完整性的问题。在删除它之前,您需要清除其子节点列表。 –