【发布时间】:2018-05-30 20:45:28
【问题描述】:
如果您查看CoreUI live demo website,您会在左侧看到一个导航栏,其中包含多个可折叠级别。我想实现这样的东西,但是是动态的。我创建了一个简单的类:
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 的字段存储了任何孩子的父母的 ID。到目前为止一切顺利。
现在我想查询它,所以我做了显而易见的事情:
var nI = db.navItems.ToList();
这相当出色,生成了一个包含所有导航项的列表,children 属性在需要时正确填充了子项。
但是,它还包括根级别的所有子项...所以我有 40 个根级别项,而不是 15 个根级别项。
是否有我可以运行的 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-root3
- 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
【问题讨论】:
-
请不要编辑您的问题以包含答案。将答案标记为已接受(如果适合您),或者发布您自己可以接受的答案
-
对不起...但我不想将自己的答案发布在其他人的答案之上。无论如何...它不起作用,所以我已经删除了它。
标签: c# linq entity-framework-core