【发布时间】:2016-11-18 19:45:38
【问题描述】:
基本上我要做的是查询父实体的子集合。根据 EF Core 文档,我可以使用 Include 和 ThenInclude 方法来做到这一点(https://docs.microsoft.com/en-us/ef/core/querying/related-data)。所以,我在我的存储库中有这段代码来获取我想要的数据:
public object GetMatchupByVideoId(int id)
{
var videoMatchup = _DBContext.Matchups
.Where(m => m.VideoID == id)
.Include(m => m.Players).ThenInclude(p => p.Character)
.Include(m => m.Players).ThenInclude(p => p.User);
return videoMatchup;
}
此代码实质上是查找与传递的id 匹配的Matchups 实体。然后它出去并包含Players 集合,这是模型上的导航属性。返回的数据如下所示:
[
{
"id": 1,
"players": [
{
"id": 1,
"user": {
"id": 1,
"displayName": "Player 1"
},
"character": {
"id": 40,
"name": "Superman"
},
"outcome": 0
},
{
"id": 2,
"user": {
"id": 2,
"displayName": "Player 2"
},
"character": {
"id": 43,
"name": "Batman"
},
"outcome": 1
}
]
}
]
这一切都很好,但它给了我比我真正感兴趣的更多的数据。例如,我宁愿让我的user 属性只有displayName 属性的值。除此之外,这是我想要的数据结构,我只是想改变一些属性。
四处寻找答案我发现有些人建议使用SelectMany。所以,当我重新排列我的代码时:
public object GetMatchupByVideoId(int id)
{
var videoMatchup = _DBContext.Matchups
.Where(m => m.VideoID == id)
.SelectMany(m => m.Players, (parent, child) => new { parent, child })
.Select(pc => new {
players = pc.child
});
return videoMatchup;
}
返回的数据如下:
[
{
"players": {
"id": 1,
"user": null,
"character": null,
"outcome": 0
}
},
{
"players": {
"id": 2,
"user": null,
"character": null,
"outcome": 1
}
}
]
这有一些缺点。首先是没有加载任何相关数据,它们是 players 的两个独立对象,而它应该只是在一个集合中。
所以,我有几个问题我认为都与同一个答案有关:
- 有没有一种方法可以在不使用
Include的情况下查询子数据?我很难相信这是唯一的方法。 - 如何使用
SelectMany方法将我的对象协调到一个列表中,就像返回的第一个数据结构一样? - 以这种方式加载子集合时,如何更精细地控制更改的属性?
- 如果我要加载多个子实体怎么办?
【问题讨论】:
标签: c# asp.net entity-framework entity-framework-core