You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何加载递归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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:21:07