如何加载递归NavItem实体,避免子项出现在根层级?
解决EF Core查询多级导航项时子项重复出现在根层级的问题
我最近在做一个类似CoreUI在线演示网站的多级可折叠导航栏,打算用EF Core动态实现这个功能,于是创建了NavItem实体类:
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的示例数据填充了数据库,数据存储是正常的,子项的父ID会记录在对应的字段里。
但当我用var nI = db.navItems.ToList();查询所有导航项时,虽然子项能正确填充到对应父项的children属性中,但所有子项也会出现在根层级的列表里——原本只有15个根项,结果变成了40个,这显然不符合导航栏的需求。
我想要一个优雅的LINQ查询方案:既能排除根层级中存在父ID(也就是本身是子项的条目),又能完整保留导航的层级结构。目前我能想到的是给实体加一个isRoot布尔属性再过滤,但总觉得这种方式不够优雅,希望有更好的解决办法。
内容的提问来源于stack exchange,提问作者Ade
相关产品推荐
相关产品推荐

