Явная загрузка коллекций внуков в EF 4.1 - PullRequest
22 голосов
/ 11 мая 2011

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

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 в одну поездку.

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

1 Ответ

20 голосов
/ 11 мая 2011

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

context.Entry(parent)
       .Collection(p => p.Children)
       .Query()
       .Include(c => c.Grandchildren) // I'm not sure if you can include grandchild directly  
       .Load();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...