LINQ Max Grandchild - PullRequest
       5

LINQ Max Grandchild

2 голосов
/ 12 марта 2012

У меня есть следующая иерархия объектов в коде Entity Framework First:

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?

Редактировать
Кроме того, возможно ли вернуть имя внуков вместе с их возрастом? В основном, максимальный возраст внука и кто этот внук?

Ответы [ 2 ]

3 голосов
/ 12 марта 2012
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()
};
1 голос
/ 12 марта 2012

Вы можете сделать это:

var query = from p in parents
            select
            {
              Name = p.Name,
              MaxAge = p.SelectMany(parent => parent.children)
                .SelectMany(child => child.children)
                .Max(i => i.Age)
            };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...