Вы должны отредактировать свой вопрос или разбить его на более конкретные вопросы.
Я отвечу на конкретный вопрос в вашем комментарии о том, как рекурсивно загружать ваши MenuItems.
Вы написали, что используете обычный ADO.NET. Я мог свободно использовать dapper в моем примере кода, который немного облегчает жизнь:
Так вот вам класс MenuItem:
public class MenuItem
{
public int Id { get; set; }
public int? ParentId { get; set; }
public List<MenuItem> Children { get; set; }
}
Теперь мы открываем соединение и загружаем всю таблицу MenuItems
в одну коллекцию:
SqlConnection conn = new SqlConnection("...");
conn.Open();
IEnumerable<MenuItem> allItems = conn.Query<MenuItem>("SELECT * FROM MenuItems");
Я предполагаю, что у вас будет один элемент MenuItem в качестве корневого элемента с ParentId = null
. Давайте найдем это:
MenuItem rootMenu = allItems.Single(m => m.ParentId == null);
Последнее, что нам нужно сделать, - это переставить элементы в иерархическом дереве. Мы делаем это с помощью функции, которая работает рекурсивно:
loadChildren(rootMenu, allItems);
Вот функция. Он просто ищет дочерние элементы переданного элемента и вызывает себя на всех найденных дочерних узлах:
private static void loadChildren(MenuItem currentItem,
IEnumerable<MenuItem> allItems)
{
currentItem.Children = allItems
.Where(m => m.ParentId == currentItem.Id).ToList();
foreach (var childItem in currentItem.Children)
{
loadChildren(childItem, allItems);
}
}