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
相关产品推荐
相关产品推荐

