2012-03-12 46 views
2

我在实体框架代码优先对象的层次结构如下:LINQ最大孙子

class Parent { 
    public int Id { get; set; } 
    public string Name { get; set; } 

    public virtual ICollection<Child> Children { get; set; } 
} 

class Child { 
    public int Id { get; set; } 
    public int ParentId { get; set; } 

    public virtual ICollection<Grandchild> Grandchildren { get; set; } 
} 

class Grandchild { 
    public string Name { get; set; } 
    public int Age { get; set; } 
} 

我想要检索的父母的名单和他们的大孙子的年龄。如果我有2个父母在我的数据库,每个父母有2个孩子,每个孩子有2个孩子:

Parent 1 
    Child 1 
     Grandchild 1 - Age 10 
     Grandchild 2 - Age 15 
    Child 2 
     Grandchild 3 - Age 3 
     Grandchild 4 - Age 7 
Parent 2 
    Child 3 
     Grandchild 5 - Age 1 
     Grandchild 6 - Age 9 
    Child 4 
     Grandchild 7 - Age 18 
     Grandchild 8 - Age 16 

我想查询返回两个对象:

var expected = new List<anon> 
{ 
    new { Name = "Parent 1", MaxAge = 15 }, 
    new { Name = "Parent 2", MaxAge = 18 } 
}; 

我怎么可以这样写在LINQ to Entities中?

编辑
此外,是否有可能与他们的年龄一起返回grandchilds名字?基本上有孙子的最大年龄和那个孙子是谁?

+0

我假设有可能为孩子不要有孙子(空)? – 2012-03-12 14:10:21

+0

另外你说的LINQ to Entities,还有数据库,我假设你已经读过这些实体并将它们存储在列表或其他东西中? – 2012-03-12 14:11:20

+0

他们在DbSet Dismissile 2012-03-12 14:12:02

回答

3
from parent in db.Parents 
select new 
{ 
    Name = parent.Name, 
    MaxAge = (
     from child in parent.Children 
     from grandchild in child.Grandchildren 
     select grandchild.Age) 
     .Max() 
}; 
+0

谢谢你的工作。 – Dismissile 2012-03-12 14:26:06

1

你可以这样做:

var query = from p in parents 
      select 
      { 
       Name = p.Name, 
       MaxAge = p.SelectMany(parent => parent.children) 
       .SelectMany(child => child.children) 
       .Max(i => i.Age) 
      };