gpt4 book ai didi

c# - Entity Framework Core 和包括子集合

转载 作者:行者123 更新时间:2023-12-04 00:30:17 25 4
gpt4 key购买 nike

本质上,我要做的是查询父实体的子集合。根据 EF Core 文档,我可以使用 IncludeThenInclude 方法来执行此操作 ( 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
}
]
}
]

这一切都很好,但它给我的数据比我真正感兴趣的要多。例如,我宁愿让我的 user 属性只有一个值 显示名称 属性。除此之外,这是我想要的数据结构,我只是想更改一些属性。

四处寻找答案,我发现有些人建议使用 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 方法将我的对象协调到一个列表中,就像返回的第一个数据结构一样?
  • 以这种方式加载子集合时,如何更精细地控制更改属性?
  • 如果我要加载多个子实体怎么办?

最佳答案

正如我所怀疑的那样,我提出的所有问题都与一个单一的答案有关。在四处搜索并完成它之后,您可以通过以下方式完成此操作:

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;
}

SelectMany 在这里不是正确的方法。您想要的是使用 Select 并从您的子列表中使用投影。这回答了我提出的以下问题:

  • 有没有一种方法可以在不使用 Include 的情况下查询子数据?我很难相信这是唯一的方法。

只需使用 Select 方法将您的子列表转换到您的导航属性中。

  • 如何使用 SelectMany 方法将我的对象协调到一个列表中,就像返回的第一个数据结构一样?

在这种情况下,您不会这样做,因为 SelectMany 用于展平列表列表。

  • 我如何更精细地控制更改属性时以这种方式加载子集合?

与第一个答案相同。

  • 如果我要加载多个子实体怎么办?

与第一个答案相同。

关于c# - Entity Framework Core 和包括子集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40684900/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com