Включить внуков в EF Query

Учитывая иерархию объектов

public class Parent
{
    public int Id { get; set; }
    public virtual Child Child { get; set; }
}

public class Child
{
    public int Id { get; set; }
    public virtual GrandChild GrandChild { get; set; }
}

public class GrandChild
{
    public int Id { get; set; }
}

и контекст БД

public class MyContext : DbContext
{
    public DbSet<Parent> Parents { get; set; }
}

Можно включить детей и внуков с помощью синтаксиса лямбда (using System.Data.Entity) следующим образом:

using (MyContext ctx = new MyContext())
{
    var hierarchy = 
        from p in ctx.Parents.Include(p => p.Child.GrandChild) select p;
}

Синтаксис Lambda предотвращает нарушение запроса, если имена классов впоследствии изменены. Однако, если Parent имеет вместо этого ICollection<Child>:

public class Parent
{
    public int Id { get; set; }
    public virtual ICollection<Child> Children { get; set; }
}

Синтаксис Lambda больше не работает. Вместо этого можно использовать строковый синтаксис:

var hierarchy = from p in ctx.Parents.Include("Children.GrandChild") select p;

Является ли синтаксис строки единственным вариантом или есть альтернативный способ использования синтаксиса лямбда в этой ситуации?

Ответ 1

Конечно, вы можете сделать

var hierarchy = from p in ctx.Parents
                    .Include(p => p.Children.Select(c => c.GrandChild))
                select p;

Смотрите MSDN, заголовок Примечания, пятая марка.

Ответ 2

Обновление: Если вы используете Entity Framework Core, вы должны использовать следующий синтаксис

var hierarchy = from p in ctx.Parents
                    .Include(p => p.Children)
                    .ThenInclude(c => c.GrandChild)
                select p;