我正在将 .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(使用前将#替换为@)