C# Linq EF将父级拆分为多个父级

C# Linq EF将父级拆分为多个父级,c#,entity-framework,linq,C#,Entity Framework,Linq,使用实体框架查询具有1-n关系的父表和子表的数据库: public class Parent { public int id { get; set; } public IList<Child> Children { get; set; } } public class Child { public int id { get; set; } } public class ParentChild { public Parent Parent { get

使用实体框架查询具有1-n关系的父表和子表的数据库:

public class Parent {
    public int id { get; set; }
    public IList<Child> Children { get; set; }
}

public class Child {
    public int id { get; set; }
}
public class ParentChild {
    public Parent Parent { get; set; }
    public Child Child { get; set; }
}
返回:

parent id = 1, children = { (id = 1), (id = 2), (id = 3) }
我们需要的是将这种关系简化为一对一的关系,但作为一份单亲家长名单:

parent id = 1, children = { (id = 1) }
parent id = 1, children = { (id = 2) }
parent id = 1, children = { (id = 3) }
我们使用的是一个OData服务层,它可以访问EF。因此,性能是一个问题——例如,不希望它执行ToList或迭代整个结果

我们尝试了几种不同的方法,最接近的方法是创建一个匿名类型,如下所示:

var results = from p in context.Parents
              from c in p.Children
              select new { Parent = p, Child = c }
但这并不是我们真正想要的。它创建匿名类型的父级和子级,而不是父级和子级。因此,我们不能再返回IEnumerable,而是返回IEnumerable。匿名类型不适用于我们的OData服务层

也尝试了SelectMany,得到了3个结果,但所有的孩子都不是我们所需要的:

context.Parents.SelectMany(p => p.Children)

我们想做的事可能吗?对于提供的示例数据,我们希望返回3行-表示一个列表,每个列表都有一个子元素。通常情况下,它返回1个父级和3个子级,我们希望父级返回3次,每个子级返回一个。

您的要求没有任何意义,EF和LINQ工作方式背后的想法不是像SQL那样重复的信息。但是你更了解他们,我们不了解整个情况,所以我会尝试回答你的问题,希望我理解正确

如果如您所说,您的问题是IEnumerable不能与OData服务层一起工作,那么请为关系创建一个类:

public class Parent {
    public int id { get; set; }
    public IList<Child> Children { get; set; }
}

public class Child {
    public int id { get; set; }
}
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 }

但这不是我们真正想要的,所以你想要什么?您提到的LINQ查询提供了与您描述的结果类似的平坦结果。如果您对它有一些问题,请描述它们,以便我们可以帮助您。@RacilHilan-我们已用斜体字更新了该问题。让我们知道如果你有任何问题。这不是一个支持的特性,因为任何理智的开发者都会认为它是一个bug。你可能真正想要的是构造一个ParentDto类,你应该映射到这个类。我和Aron在一起,闻起来另一端有点不对劲,但我不会判断。从子端选择,然后实际形成父级,“选择新父级{}”,并适当地分配每个子级和父级。因此,使用Linq with EF,无法将具有3个子级的父级转换为具有1个子级的3个父级?想象一下表示结果的sql——它们返回3行,但EF将它们组合成1行和3个子行。基本上我们想要3行,每行有一个孩子。。。不知道这是否只是OData服务层的局限性。这与我们实现的接近,但OData不支持复杂类型,所以我们必须单独列出每个属性。不理想,但似乎正在发挥作用。谢谢你的帮助。关于要求,我同意——如果没有大量的背景信息,理解起来很困难。