Подтвердить что ты не робот

Явная загрузка коллекций внуков в EF 4.1

Учитывая следующую модель...

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

public class Child
{
    public int Id { get; set; }
    public ICollection<Grandchild> Grandchildren { get; set; }
}

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

... мы можем загружать Include a Parent со всеми Children и Grandchildren за один шаг:

context.Parents.Include(p => p.Children.Select(c => c.Grandchildren))

Возможно ли что-то подобное для явной загрузки?

Детская коллекция может быть явно загружена следующим образом:

Parent parent = context.Parents.Find(parentId);
context.Entry(parent).Collection(p => p.Children).Load();

Но попытка загрузить детей аналогично Include...

context.Entry(parent)
    .Collection(p => p.Children.Select(c => c.Grandchildren)).Load();

... не компилирует и не перегружает строку Collection...

context.Entry(parent).Collection("Children.Grandchildren").Load();

... выдает исключение ( "... не допускается использование точечных путей..." ).

Единственное, что я нашел, - это явно загрузить Grandchildren в цикле:

Parent parent = context.Parents.Find(parentId);
context.Entry(parent).Collection(p => p.Children).Load();
foreach (var child in parent.Children)
    context.Entry(child).Collection(c => c.GrandChildren).Load();

Мне интересно, пропустил ли я что-нибудь, и если есть какой-то другой способ явно загрузить Grandchildren в один раунд.

Спасибо за отзыв!

4b9b3361

Ответ 1

Как я указал в комментарии, вы можете сначала попытаться получить запрос для связи, затем добавить include и выполнить загрузку. Что-то вроде:

context.Entry(parent)
       .Collection(p => p.Children)
       .Query()
       .Include(c => c.Grandchildren) // I'm not sure if you can include grandchild directly  
       .Load();