簡體   English   中英

Linq EF將父級拆分為多個父級

[英]Linq EF Split Parent into multiple Parents

使用實體框架查詢具有1-n關系的Parent表和Child表的數據庫:

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次,每個孩子帶一個孩子。

您的需求沒有任何意義,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 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM