Если вы посмотрите на демонстрационный веб-сайт CoreUI , вы увидите навигационную панель с левой стороны, с множеством складных уровней.Я хочу реализовать что-то подобное, но динамически.Я создал простой класс:
public class NavItem
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int navItemId { get; set; }
public int sortOrder { get; set; }
public bool isTitle { get; set; }
public bool isDivider { get; set; }
public string cssClass { get; set; }
public string name { get; set; }
public string url { get; set; }
public string icon { get; set; }
public string variant { get; set; }
public string badgeText { get; set; }
public string badgeVariant { get; set; }
public virtual ICollection<NavItem> children { get; set; }
}
Обратите внимание на свойство ICollection<NavItem> children
.
В любом случае, я заполнил его набором образцов данных (пример CoreUI), и он правильно сохраняется вбаза данных, с полем с именем NavItemId1, хранящим идентификатор родителя любого потомка.Пока все хорошо.
Теперь я хотел бы сделать запрос, поэтому я сделал очевидное:
var nI = db.navItems.ToList();
Это, довольно блестяще, дает список, содержащий все элементы навигации,со свойством children
, правильно заполненным дочерними объектами, где это необходимо.
Однако оно также включало все дочерние элементы на корневом уровне ... так что вместо 15 элементов корневого уровня у меня есть 40.
Есть ли запрос linq, который я могу выполнить, чтобы предотвратить заполнение корневого уровня списка дочерними элементами (т. Е. Исключая любое, где поле NavItemId1! = Null), но все равно правильно загружает оставшуюся частьструктура?
например вот что я получаю сейчас:
- root1
- root2
- child1-of-root2
- child2-of-root2
- child1-of-child2-of-root2
- root3
- child1-of-root3
<-- I want my list to end here
- child1-of-root2
- child2-of-root2
- child1-of-child2-of-root2
- child1-of-child2-of-root2
- child1-of-root3
Я мог бы добавить логическое свойство isRoot
, а затем выполнить запрос после чтения, чтобы отбросить любые элементы.на уровне корня, у которого не установлено isRoot
, например,
var nI = db.navItems.ToList();
nI = nI.Where(p => p.isRoot).ToList();
, но это кажется слишком громоздким.
Пример кода, показывающий проблему.В частности, посмотрите на пункты 6 и 16 (1-й с 1-м уровнем детей, 2-й с 2-мя уровнями).
https://github.com/adev73/EFCore-LoadParentWithChildren-Example