使用實體框架查詢與Parent
表的數據庫和Child
表與1-n
關係:LINQ的EF拆分父成多的家長
public class Parent {
public int id { get; set; }
public IList<Child> Children { get; set; }
}
public class Child {
public int id { get; set; }
}
使用EF,這裏有一個快速的查詢示例:
var parents = context.Parents;
將返回:
parent id = 1, children = { (id = 1), (id = 2), (id = 3) }
我們需要的是這個變平成1-1
關係,但作爲父母與一個孩子每一個列表:
parent id = 1, children = { (id = 1) }
parent id = 1, children = { (id = 2) }
parent id = 1, children = { (id = 3) }
我們正在使用的命中EF OData服務層。因此,性能是一個問題 - 不希望它執行ToList()
或迭代整個結果。
我們已經嘗試了幾種不同的東西,我們可以得到最接近的是創建一個匿名類型像這樣:
var results = from p in context.Parents
from c in p.Children
select new { Parent = p, Child = c }
但是,這是不是真的就是我們要尋找的。 它創建一個匿名類型的父母和孩子,而不是父母和孩子。因此我們不能再返回IEnumerable<Parent>
,而是返回IEnumerable<anonymous>
。匿名類型不適用於我們的OData服務層。
與SelectMany
也試過,得到了3個結果,但所有的Children
這又是不太我們所需要的:
context.Parents.SelectMany(p => p.Children)
就是我們試圖做可能嗎? 隨着提供的示例數據,我們希望返回3行 - 表示每個都有一個Child的List。通常情況下,它會返回1個包含3個孩子的父母,我們希望每個父母都返回3次。
**但是這不是我們正在尋找**,所以你在找什麼?您提到的LINQ查詢可爲您提供類似於您所描述的結果。如果您遇到問題,請描述它們以便我們幫助您。 –
@RacilHilan - 我們用斜體更新了這個問題。如果你有任何疑問,請告訴我們。 – user2480596
這不是一項支持的功能,因爲任何理智的開發人員都會認爲它是一個錯誤。你可能想要的是構建一個你應該映射到的'ParentDto'類。 – Aron