2015-10-06 37 views
0

使用實體框架查詢與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次。

+1

**但是這不是我們正在尋找**,所以你在找什麼?您提到的LINQ查詢可爲您提供類似於您所描述的結果。如果您遇到問題,請描述它們以便我們幫助您。 –

+0

@RacilHilan - 我們用斜體更新了這個問題。如果你有任何疑問,請告訴我們。 – user2480596

+0

這不是一項支持的功能,因爲任何理智的開發人員都會認爲它是一個錯誤。你可能想要的是構建一個你應該映射到的'ParentDto'類。 – Aron

回答

2

您的要求沒有任何意義,EF和LINQ的工作原理並不像SQL那樣重複的信息。但是你更瞭解他們,我們不知道整個情況,所以我會盡力回答你的問題,希望我能正確理解它。

如果像你說的,你的問題是,IEnumerable<anonymous>不與你的OData服務層的工作,然後創建的關係類:

public class ParentChild { 
    public Parent Parent { get; set; } 
    public Child Child { get; set; } 
} 

然後你就可以在你的LINQ查詢中使用:

var results = from p in context.Parents 
       from c in p.Children 
       select new ParentChild { Parent = p, Child = c } 
+0

這與我們實現的接近,但OData不支持複雜類型,所以我們必須單獨列出每個屬性。不理想,但似乎工作。謝謝你的幫助。關於要求,我同意 - 在沒有更多背景信息的情況下難以理解。 – user2480596