基本上我想做的是查询父实体的子集合。根据EF Core文档,我可以使用
这很好,但是它给了我比我真正感兴趣的更多的数据。例如,我更希望我的
寻找答案时,我发现有人建议使用
返回的数据看起来像这样:
Include
和ThenInclude
方法来实现这一点(https://learn.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
}
]
}
]
这很好,但是它给了我比我真正感兴趣的更多的数据。例如,我更希望我的
用户
属性只有一个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
方法将对象对齐到一个列表中,就像第一种返回的数据结构一样? - 在以这种方式加载子集合时,如何更精细地控制更改属性?
- 如果有多个子实体需要加载怎么办?