繁体   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