EF Core 7如何从指定子级获取同一父级的所有孙级数据?
解决方案
你可以利用EF的导航属性和LINQ的关联查询能力,一步完成数据筛选、关联加载与分组,彻底摆脱循环查询和存储过程的依赖:
方法1:通过子级导航关联查询
// 定位到mychild所属父级的所有孙级,包含关联Notes后按类别分组 var groupedGrandchildren = context.Children // 筛选出与mychild同属一个父级的所有子级 .Where(child => child.ParentId == mychild.ParentId) // 平铺开所有子级对应的孙级数据 .SelectMany(child => child.Grandchildren) // 加载孙级关联的Notes数据 .Include(grandchild => grandchild.Notes) // 按孙级的类别分组 .GroupBy(grandchild => grandchild.Category) .ToList();
方法2:直接从孙级表关联筛选
如果Grandchild实体已配置到Child的导航属性,也可以直接从孙级表出发查询,逻辑更直观:
var groupedGrandchildren = context.Grandchildren // 筛选出父级ID与mychild一致的所有孙级 .Where(g => g.Child.ParentId == mychild.ParentId) // 加载关联的Notes数据 .Include(g => g.Notes) // 按类别分组 .GroupBy(g => g.Category) .ToList();
核心优势
- 解决了原方法的N+1查询问题:EF会自动生成高效的JOIN语句,一次性拉取所有需要的数据,避免循环查询带来的性能损耗
- 完全基于EF实体与导航属性实现,无需维护存储过程和额外返回实体,代码可读性、可维护性更强
- 用LINQ原生语法完成分组逻辑,无需手动处理中间列表
内容的提问来源于stack exchange,提问作者Paul Gibson
相关产品推荐
相关产品推荐

