entity-framework – 在Junction表上使用EF Core ThenInclude()

我正在将我的.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(Select直接进入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().我在查询中进一步查看了多个联结表,但为了简单起见,我们只关注第一个.

我该如何工作?

解决方法

but I get an ICollection in the last lambda displayed,so I obviously need the Select()

不,你没有. EF Core Include / ThenInclude完全取代了EF6中使用的Select / SelectMany的需要.它们对集合和引用类型导航属性都有单独的重载.如果对集合使用重载,则ThenInclude对集合元素的类型进行操作,因此最后总是以单个实体类型结束.

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

例如,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)

相关文章

### 创建一个gRPC服务项目(grpc服务端)和一个 webapi项目(...
一、SiganlR 使用的协议类型 1.websocket即时通讯协议 2.Ser...
.Net 6 WebApi 项目 在Linux系统上 打包成Docker镜像,发布为...
一、 PD简介PowerDesigner 是一个集所有现代建模技术于一身的...
一、存储过程 存储过程就像数据库中运行的方法(函数) 优点:...
一、Ueditor的下载 1、百度编辑器下载地址:http://ueditor....