在连接表上使用 EF Core ThenInclude()

2024-01-06

我正在将 .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/lated-data.html https://docs.efproject.net/en/latest/querying/related-data.html似乎表明我不需要它,我可以立即访问 Author,但我在显示的最后一个 lambda 中得到一个 ICollection,所以我显然需要 Select()。我在查询中进一步查看多个联结表,但为了简单起见,我们只关注第一个联结表。

我该如何进行这项工作?


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

不,你不知道。 EF核心Include / ThenInclude完全取代的需要Select / SelectMany在 EF6 中使用。它们都有针对集合和引用类型导航属性的单独重载。如果您将重载与集合一起使用,ThenInclude对集合类型进行操作element,所以最后你总是得到一个单一的实体类型。

就你而言,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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在连接表上使用 EF Core ThenInclude() 的相关文章

随机推荐