Entity Framework Core如何仅查询关联实体指定属性且不返回匿名类型
实现方案
首先你需要提前定义好匹配返回字段的强类型DTO:
// 强类型返回DTO定义 public class PlaylistDTO { public int Id { get; set; } public string PlaylistName { get; set; } }
写法1:直接基于Playlist查询(性能最优,推荐)
Playlist实体本身携带TeamId外键,直接过滤即可,无需关联Team表:
List<PlaylistDTO> playlists = await _context.Playlists .AsNoTracking() .Where(p => p.TeamId == teamId) .Select(p => new PlaylistDTO { Id = p.Id, PlaylistName = p.PlaylistName }) .ToListAsync();
该写法生成的SQL只会查询Id和PlaylistName两个字段,无多余数据加载,返回结果直接是强类型的List<PlaylistDTO>。
写法2:从Team维度查询(适合需要同时校验Team是否存在的场景)
如果你需要先确认指定Id的Team是否存在,再查询其关联的Playlist,可以使用SelectMany展开关联集合直接投影:
List<PlaylistDTO> playlists = await _context.Teams .AsNoTracking() .Where(t => t.Id == teamId) .SelectMany(t => t.Playlists.Select(p => new PlaylistDTO { Id = p.Id, PlaylistName = p.PlaylistName })) .ToListAsync();
如果指定Id的Team不存在,返回的是空列表,你也可以根据业务需要提前加Team存在性校验。
你之前两种写法的问题:
- 第一种写法是把所有Playlist的Id、Name分别拼成两个集合封装到匿名类里,结构和需求不符
- 第二种写法用
Include加载关联实体时会默认拉取Playlist的全字段,不符合字段裁剪的要求
内容的提问来源于stack exchange,提问作者CMorgan
相关产品推荐
相关产品推荐

