如何编写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();
补充说明
- 若你的Module实体未显式定义
CourseId外键属性,可通过导航属性关联筛选(性能略低于外键查询):var modules = context.Modules .Include(m => m.Chapters) .Include(m => m.Notes) .Where(m => m.Course.Id == courseId) .ToList(); - 使用两个独立的
Include是EF Core中加载同一实体多个导航属性的标准方式,替代原查询中嵌套ThenInclude的写法。
内容的提问来源于stack exchange,提问作者John S
相关产品推荐
相关产品推荐

