[英]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.