.NET Core/EF Core Linq如何获取含指定嵌套层级的实体?
用EF Core Linq实现4级嵌套导航属性查询
完全可以用EF Core的Linq实现这种固定4级嵌套的查询,核心是通过Include和ThenInclude的链式调用,逐层指定要加载的导航属性——不管是同实体的自嵌套还是跨实体的关联嵌套都能支持。
先明确实体结构(参考你的定义)
public class MainModel { public int Id { get; set; } public ICollection<ModelA> ModelAs { get; set; } public ICollection<ModelB> ModelBs { get; set; } } public class ModelA { public int Id { get; set; } // 自嵌套导航属性 public ICollection<ModelA> ChildModelAs { get; set; } // 跨实体关联导航属性 public ICollection<ModelB> RelatedModelBs { get; set; } } public class ModelB { public int Id { get; set; } // 自嵌套导航属性 public ICollection<ModelB> ChildModelBs { get; set; } // 跨实体关联导航属性 public ICollection<ModelA> RelatedModelAs { get; set; } }
4级嵌套查询的Linq实现示例
如果需要同时加载MainModel下的ModelA(含4级自嵌套+关联的ModelB4级嵌套)、ModelB(含4级自嵌套+关联的ModelA4级嵌套),可以这么写:
var mainModels = await dbContext.MainModels // 加载MainModel的ModelA集合,以及ModelA的4级自嵌套 .Include(m => m.ModelAs) .ThenInclude(a => a.ChildModelAs) .ThenInclude(a2 => a2.ChildModelAs) .ThenInclude(a3 => a3.ChildModelAs) // 同时加载ModelA每一层关联的ModelB的4级嵌套 .ThenInclude(a => a.RelatedModelBs) .ThenInclude(b => b.ChildModelBs) .ThenInclude(b2 => b2.ChildModelBs) .ThenInclude(b3 => b3.ChildModelBs) // 加载MainModel的ModelB集合,以及ModelB的4级自嵌套 .Include(m => m.ModelBs) .ThenInclude(b => b.ChildModelBs) .ThenInclude(b2 => b2.ChildModelBs) .ThenInclude(b3 => b3.ChildModelBs) // 同时加载ModelB每一层关联的ModelA的4级嵌套 .ThenInclude(b => b.RelatedModelAs) .ThenInclude(a => a.ChildModelAs) .ThenInclude(a2 => a2.ChildModelAs) .ThenInclude(a3 => a3.ChildModelAs) .ToListAsync();
补充说明
- 如果只需要加载某一类嵌套(比如只需要
ModelA的4级嵌套,不需要ModelB的),直接去掉对应的Include分支即可。 - 这种手动链式调用只适合固定层级的场景,如果层级不固定,才需要考虑动态构建
Include或者用递归逻辑,但你这里是明确的4级,手动写最直接。 - 层级过多可能会生成复杂的SQL,影响查询性能,建议根据实际数据量评估,必要时可以拆分查询或用投影只加载需要的字段。
内容的提问来源于stack exchange,提问作者patsy2k
相关产品推荐
相关产品推荐

