使用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次,每个孩子都有一个孩子。
答案 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 }