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

如何编写EF Core LINQ查询加载Course的Modules及其Chapters和Notes

问题:获取指定课程下的Module并直接加载其Chapters和Notes的EF Core LINQ查询

原查询会加载Course、其关联的Modules、Modules的Chapters以及Chapters的Notes,现需求调整为直接加载指定课程下的Module自身的Chapters和Notes(无需加载Course实体本身)。

当前查询代码:

var course = context.Courses
    .Include(c => c.Modules)
        .ThenInclude(m => m.Chapters)
            .ThenInclude(c => c.Notes)
    .Single(c => c.Id == courseId);

实体类定义:

public class Course
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<Module> Modules { get; set; }
    public Lab Lab { get; set; }
}

public class Module
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<Chapter> Chapters { get; set; }
    public List<Note> Notes {get;set;}
}

public class Chapter
{
    public int Id { get; set; }
    public string Title { get; set; }
}
public class Note
{
    public int Id { get; set; }
    public string Content { get; set; }
}

解决方案

直接从context.Modules集合发起查询,通过Module与Course的外键关联筛选指定课程下的模块,同时用Include分别加载每个Module的Chapters和Notes导航属性:

var modules = context.Modules
    .Include(m => m.Chapters)
    .Include(m => m.Notes)
    .Where(m => m.CourseId == courseId)
    .ToList();

补充说明

  1. 若你的Module实体未显式定义CourseId外键属性,可通过导航属性关联筛选(性能略低于外键查询):
    var modules = context.Modules
        .Include(m => m.Chapters)
        .Include(m => m.Notes)
        .Where(m => m.Course.Id == courseId)
        .ToList();
    
  2. 使用两个独立的Include是EF Core中加载同一实体多个导航属性的标准方式,替代原查询中嵌套ThenInclude的写法。

内容的提问来源于stack exchange,提问作者John S

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 14:45:04