Entity Framework Core如何条件式加载已关联属性的子实体
解决方法
方案1:重构查询链,按需构建完整Include(推荐)
你之前担心Include.ThenInclude会导致SongArtistRelations被查询两次是误解——EF Core会将Include和ThenInclude合并为一次SQL查询,一次性加载所有层级的关联数据,不会重复查询关联表。
直接根据条件构建完整的查询链即可:
var query = _context.Songs.AsQueryable(); if (request.IncludeArtists) { // 一次性加载Song、关联的SongArtistRelations及对应的Artist query = query.Include(s => s.SongArtistRelations) .ThenInclude(ar => ar.Artist); } else { // 仅加载Song和SongArtistRelations query = query.Include(s => s.SongArtistRelations); }
方案2:使用字符串重载的Include(可选)
如果需要保留初始的Include(s => s.SongArtistRelations),可以用字符串形式的嵌套Include来追加加载Artist:
var query = _context.Songs .Include(s => s.SongArtistRelations) .AsQueryable(); if (request.IncludeArtists) { query = query.Include("SongArtistRelations.Artist"); }
这种方式不需要拆分初始查询,但缺点是没有强类型检查,属性名拼写错误要到运行时才会发现。
为什么你之前的代码报错?
EF Core的Include方法要求参数是直接的导航属性访问表达式,不能使用Select等投影操作——你写的s.SongArtistRelations.Select(ar => ar.Artist)是投影,不符合Include的语法要求,所以会抛出异常。
内容的提问来源于stack exchange,提问作者Dani Suba
相关产品推荐
相关产品推荐

