Linq EF将父母分成多个父母

时间:2015-10-06 01:29:25

标签: c# entity-framework linq

使用Entity Framework查询数据库,其中Parent表和Child表格具有1-n关系:

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 个答案:

答案 0 :(得分: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 }