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

LINQ和EF中Include/ThenInclude后嵌套Chapters未返回求助

解决EF Core中Include/ThenInclude后嵌套实体未加载的问题

嘿,我来帮你搞定这个问题!你遇到的情况其实是EF Core里一个常见的小坑——当你用Select做投影的时候,之前针对根实体(这里是AuthorBooks)的Include和ThenInclude并不会自动传递到你投影出来的Book实体上。

解决方案1:直接查询Book实体(推荐)

既然你的目标是获取指定作者的带Chapters的Books,不如直接从Books表入手,通过关联的AuthorBooks来筛选作者ID,这样Include就能正常生效了:

var booksWithChapters = await _context.Books
    // 过滤出属于目标作者的书籍
    .Where(b => b.AuthorBooks.Any(ub => ub.AuthorId == authorId))
    // 预加载Chapters嵌套实体
    .Include(b => b.Chapters)
    .ToListAsync();

解决方案2:保留从AuthorBooks查询的写法(如果有特殊需求)

如果你必须从AuthorBooks开始查询,那可以先把包含完整关联数据的AuthorBooks加载出来,再提取Book:

var authorBooks = await _context.AuthorBooks
    .Where(ub => ub.AuthorId == authorId)
    .Include(ub => ub.Book)
        .ThenInclude(b => b.Chapters)
    .ToListAsync();

// 提取Book,这时候Chapters已经被预加载完成
var booksWithChapters = authorBooks.Select(ub => ub.Book).ToList();

为什么原来的代码不生效?

简单来说,Include是用来告诉EF Core要加载当前查询根实体的关联数据。你原来的查询根是AuthorBooks,所以Include(ub => ub.Book).ThenInclude(b => b.Chapters)是让EF加载每个AuthorBooks对应的Book,以及该Book的Chapters。但当你用Select(ub => ub.Book)做投影时,EF Core会认为你只需要Book实体,这时候它可能会优化掉之前的Include逻辑,不会把Chapters一起加载进来(除非你在投影中明确引用Chapters)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:15:56