Set*_*hen 2 c# asp.net entity-framework entity-framework-core
本质上,我想做的是查询父实体的子级集合。根据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;
}
Run Code Online (Sandbox Code Playgroud)
这段代码实质上是寻找Matchups与id传递的匹配的实体。然后,它退出并包含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
}
]
}
]
Run Code Online (Sandbox Code Playgroud)
这一切都很好,但是它给了我更多的数据,而不是我真正感兴趣的数据。例如,我宁愿让我的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;
}
Run Code Online (Sandbox Code Playgroud)
返回的数据如下所示:
[
{
"players": {
"id": 1,
"user": null,
"character": null,
"outcome": 0
}
},
{
"players": {
"id": 2,
"user": null,
"character": null,
"outcome": 1
}
}
]
Run Code Online (Sandbox Code Playgroud)
这有一些缺点。首先是没有任何相关数据被加载,并且players当它们仅应位于集合中时,它们是两个单独的对象。
因此,我有几个问题,我相信它们都与相同的答案有关:
Include?我很难相信这是唯一的方法。SelectMany返回的第一个数据结构之类的方法将对象协调为一个列表?我怀疑所有提出的问题都与一个答案有关。搜索并处理完之后,可以按照以下方法完成此操作:
public object GetMatchupByVideoId(int id)
{
var videoMatchup = _DBContext.Matchups
.Where(m => m.VideoID == id)
.Select(m => new {
ID = m.VideoID,
Players = m.Players.Select(p => new {
ID = p.PlayerID,
User = p.User,
Character = p.Character,
Outcome = p.Outcome
})
});
return videoMatchup;
}
Run Code Online (Sandbox Code Playgroud)
SelectMany这不是正确的方法。您想要的是使用Select子项列表中的投影功能。这回答了我提出的以下问题:
只需使用该Select方法即可将子列表投射到导航属性中。
SelectMany返回的第一个数据结构之类的方法将对象协调为一个列表? 在这种情况下,您不会因为SelectMany用于展平列表列表而不会。
与第一个答案相同。
与第一个答案相同。
| 归档时间: |
|
| 查看次数: |
3794 次 |
| 最近记录: |