我将.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是一个联结表,还有一个Junction表" 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上的文档似乎表明我不需要它,我可以立即访问作者,但是我在显示的最后一个lambda中得到了ICollection,所以我显然需要Select()。我在查询中进一步查看了多个联结表,但为了简单起见,我们只关注第一个。
我如何使这项工作?
答案 0 :(得分:45)
但是我在显示的最后一个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)