【问题标题】:Using EF Core ThenInclude() on Junction tables在联结表上使用 EF Core ThenInclude()
【发布时间】:2016-10-29 12:48:33
【问题描述】:

我正在将我的 .NET Framework (EF6) 代码转移到 ASP.NET Core (EF Core),我偶然发现了这个问题。下面是一些示例代码:

在 EF6 中,我使用 Include() 和 Select() 进行预加载:

return _context.Post
.Include(p => p.PostAuthor.Select(pa => pa.Author).Select(a => a.Interests))

PostAuthor 是一个联结表,还有一个联结表“AuthorInterest”,我不需要在 EF6 中涉及(选择直接进入 a.Interests)。

无论如何,我可以看到在 EF7 中这已被重新设计,这意味着我现在应该使用 ThenInclude() 进行嵌套查询。不过……

return _context.Post
  .Include(p => p.PostAuthor)
    .ThenInclude(pa => pa.Select(pa2 => pa2.Author))
...etc

上面的代码由于 Select() 语句而失败。 https://docs.efproject.net/en/latest/querying/related-data.html 上的文档似乎表明我不需要它,我可以立即访问 Author,但是在显示的最后一个 lambda 中我得到了一个 ICollection,所以我显然需要 Select()。我在查询中进一步浏览了多个联结表,但为简单起见,我们只关注第一个。

我该如何进行这项工作?

【问题讨论】:

    标签: entity-framework asp.net-core asp.net-core-mvc entity-framework-core


    【解决方案1】:

    但我在显示的最后一个 lambda 中得到一个 ICollection,所以我显然需要 Select()

    不,你没有。 EF Core Include / ThenInclude 完全替代了 EF6 中使用的 Select / SelectMany。它们都有单独的集合和引用类型导航属性的重载。如果将重载与集合一起使用,ThenInclude 会在集合 元素 的类型上进行操作,因此最终您总是会得到一个实体类型。

    在您的情况下,pa 应该解析为您的联结表元素类型,因此 Author 应该可以直接访问。

    例如 EF6 包含链:

    .Include(p => p.PostAuthor.Select(pa => pa.Author).Select(a => a.Interests))
    

    转换为 EF Core:

    .Include(p => p.PostAuthor).ThenInclude(pa => pa.Author).ThenInclude(a => a.Interests)
    

    【讨论】:

    • 哇,谢谢。很奇怪——Visual Studio 不会给我 pa.Author 的智能感知(而是建议一些 Linq 方法),并且在我尝试编写它时会用红色强调所有内容。在你的帖子之后,我忽略了 VS,编译后一切都像魅力一样。
    • 这很奇怪。我正在使用 VS2015 Update 3,当我编写类似 db.Parents.Include(p => p.Children).ThenInclude(c => c.Child).ThenInclude(c => c.Parents) 的内容时,我会在每个 lambda 中获得正确的 Intellisense 支持。
    • 我正在使用 Visual Studio 2017 Preview 2,但我得到了同样错误的智能感知。忽略它并成功构建:)
    • 我在 Visual Studio 2017 Pro 中也遇到了 IntelliSense 问题,因为这里的 cmets 中还有其他一些人遇到了这个问题,我在 GitHub 上为 EF 团队打开了一个问题:github.com/aspnet/EntityFramework/issues/9374跨度>
    • 缺乏智能感知是 Roslyn 的问题。请参阅github.com/dotnet/roslyn/issues/8237 如果您使用的是 R# 之类的第 3 方工具,那么它会扩展智能感知以提供正确的结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-09
    • 2018-01-21
    • 1970-01-01
    • 2018-11-26
    • 2021-10-01
    • 2016-11-30
    相关资源
    最近更新 更多