基本上我想要做的是查詢父實體的子集合。根據EF核心文件,我可以使用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
方法將我的對象與第一個數據結構返回一致? - 以這種方式加載子集合時,如何更改粒度控制來更改屬性?
- 如果我有多個子實體加載會怎麼樣?