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

如何在EF Core中使用Join替代Include/ThenInclude?

EF Core 中 Include 与 Join 的用法区别及实现

先看你给出的 Include 示例代码:

_context.Actors
        .Include(actor => actor.Movies)
        .ThenInclude(movie => movie.MovieInfo)

Include 的作用与适用场景

Include 是EF Core用于加载关联实体的方法,它会严格保留实体类的原始对象图结构——返回的每个Actor对象里,会包含对应的Movies集合,每个Movie对象又会包含关联的MovieInfo。这种方式依赖实体间已定义的导航属性,适合需要完整对象结构的场景。

Join 的适用场景及实现

当需要获取扁平化的结果集,或者要连接两个没有定义导航属性的实体类型时,就需要使用Join。以下是两种常见场景的具体实现:

场景1:扁平化投影(获取演员与对应电影的基础信息)

var flatData = _context.Actors
    .Join(
        _context.Movies,
        actor => actor.Id,          // Actors表的关联键
        movie => movie.ActorId,     // Movies表的关联键
        (actor, movie) => new {     // 自定义投影字段
            演员姓名 = actor.Name,
            电影标题 = movie.Title
        }
    )
    .ToList();

场景2:连接无导航属性的实体(比如Actor与独立的MovieRating表)

假设Actor和MovieRating之间没有定义导航属性,但两者都通过MovieId关联到Movie,要获取演员名、电影名及对应评分:

var crossEntityData = _context.Actors
    .Join(
        _context.Movies,
        actor => actor.Id,
        movie => movie.ActorId,
        (actor, movie) => new { actor, movie }
    )
    .Join(
        _context.MovieRatings,
        am => am.movie.Id,
        rating => rating.MovieId,
        (am, rating) => new {
            演员姓名 = am.actor.Name,
            电影标题 = am.movie.Title,
            电影评分 = rating.Score
        }
    )
    .ToList();

核心区别总结

  • Include:依赖导航属性,返回完整对象图,适合需要操作实体对象的场景。
  • Join:手动指定关联逻辑,可灵活投影或跨无关联实体查询,适合扁平化结果或自定义关联的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 08:29:54