EF Core 2.0多对多查询:如何将主题名称映射到DTO子属性
问题:EF Core 2.0中如何在DTO中返回多对多关联的Topic列表?
我之前在EF Core 2.0里用中间表InsightTopicJoin实现了Insight和InsightTopic的多对多关联,现在要给查询用的DTOInsightList添加Topics属性,让返回的JSON包含每条Insight对应的所有话题名称列表。该怎么修改查询逻辑呢?
解决思路
核心就是在投影到InsightList的时候,通过Insight的InsightTopicJoins导航属性,关联到对应的InsightTopic,然后提取话题名称组成列表。不需要额外用Include,EF Core会自动处理关联查询,这样也更高效。
修改后的查询代码
if (TopicId == 0) { return await _context.Insights .Select(p => new InsightList { Heading = p.Heading, // 通过中间表关联到InsightTopic,提取Name字段组成列表 Topics = p.InsightTopicJoins.Select(j => j.InsightTopic.Name).ToList() }) .ToListAsync(); } else { return await _context.InsightTopics .Where(p => p.InsightTopicId == TopicId) .SelectMany(p => p.InsightTopicJoins) .Select(pc => pc.Insight) .Select(p => new InsightList { Heading = p.Heading, // 提取当前Insight关联的所有话题名称 Topics = p.InsightTopicJoins.Select(j => j.InsightTopic.Name).ToList() }) .ToListAsync(); }
说明
- 当查询所有Insight时,直接从
Insights表出发,通过InsightTopicJoins导航到InsightTopic,把Name收集成List<string>赋值给Topics。 - 当查询指定Topic下的Insight时,找到目标Topic后关联到对应的Insight,同样在投影时提取该Insight关联的所有话题名称(而不是只返回当前筛选的那个Topic,这样符合DTO要返回所有关联话题的需求)。
- 如果某个Insight没有关联任何Topic,
Topics会是一个空列表,JSON里会显示为[],符合预期格式。
内容的提问来源于stack exchange,提问作者Evonet
相关产品推荐
相关产品推荐

