让我们想象下面是我们的数据模型。我想查询Toys但返回结果,以便我可以执行以下伪代码。
foreach (var parent in parents)
{
Console.WriteLine(parent.Name);
foreach (var child in parent.Children)
{
Console.WriteLine(child.Name);
foreach (var toy in child.Toys)
{
Console.WriteLine(toy.Name);
}
}
}
数据模型:
public class Parent
{
public Guid ParentId { get; set; }
public String Name { get; set; }
public ICollection<Child> Children { get; set; }
}
public class Child
{
public Guid ChildId { get; set; }
public Guid ParentId { get; set; }
public Parent Parent { get; set; }
public String Name { get; set; }
public ICollection<Toy> Toys { get; set; }
}
public class Toy
{
public Guid ToyId { get; set; }
public Guid ChildId { get; set; }
public Child Child { get; set; }
public String Name { get; set; }
public bool IsCool { get; set; }
}
我尝试使用分组进行此操作,但是当我尝试迭代分组时,我看到的是Key,它没有任何属性,因此我无法获取Parent.Name或Child.Name。
提前致谢。
答案 0 :(得分:1)
你可以这样做:
var query = from p in parents
from c in p.Children
from t in c.Toys
select new { Parent = p.Name, Child = c.Name, Toy = t.Name }
foreach (var a in query)
{
// write values.
}
实际上,这会使用SelectMany。
修改强>
在您发表评论之后,我认为您所寻找的不是分组。如果你有一个Parent
对象实际上它的Children
已经在其中分组,因为每个父对象都有自己的集合。但也许你正在寻找一种填充馆藏的方法?这将由
var query = from p in parents.Include(x => x.Children.Select(c => c.Toys));
答案 1 :(得分:0)
将LazyLoadingEnabled
设置为false,您可以使用一个linq查询来加载所有相关对象。
请注意,如果您在儿童或玩具表中有大量相关数据,这可能会导致一些性能问题。
context.ContextOptions.LazyLoadingEnabled = false;
var parents = context.Parents.Select(x=>x).ToList();
foreach(var parent in parents) {
Console.WriteLine(parent.Name);
foreach(var child in parent.Children) {
Console.WriteLine(child.Name);
foreach(var toy in child.Toys) {
Console.WriteLine(toy.Name);
}
}
}