Каков наилучший способ загрузить все свойства навигации и их дочерние элементы в EF 4.1 - PullRequest
2 голосов
/ 30 июня 2011

Я пытаюсь получить List<EntityType>, каждый элемент имеет около 15 навигационных свойств, которые мне нужно загрузить, некоторые из навигационных свойств имеют свойства навигации, которые мне тоже нужно загрузить, это пример кода

class AA
{
  public EntityReference<B> Bobj
  {
     get;
     set;
  }
  public EntityCollection<C> CCollection
  {
     get;
     set;
  }
}
class B
{
  public EntityCollection<X> XCollection
  {
     get;
     set;
  }
}
class C
{
  public EntityReference<Y> YObj
  {
     get;
     set;
  }
}

List<AA> AList = Dbcontext.AAs.Where(a => a.ID==4).ToList();

Я хочу, чтобы каждый элемент в List<AA> был загружен с BObj с XCollection и со всеми CCollection элементами с YObj.

Я пыталсязагрузите их, используя Include и Load, но я думаю, что есть элегантный способ сделать это

, также я попытался установить LazyLoadingEnabled в false, но это незагрузить полный график Я не знаю почему?

, поэтому, пожалуйста, мне нужен лучший способ загрузить полный график моего EntityType

Я использую База данных сначала подход EF 4.1 и C# 4.0

Ответы [ 2 ]

5 голосов
/ 30 июня 2011

Вот изящный трюк, который я подобрал:

List<AA> AList = Dbcontext.AAs.Where(a => a.ID==4)
    .Select(a => new {a, a.Bobj, a.CCollection})
    .ToList().Select(o => o.a).ToList();

Dbcontext.Bs.Where(b => b.A.ID==4)
    .Select(b => new {b, b.XCollection})
    .ToList();
Dbcontext.Cs.Where(c => c.A.ID==4)
    .Select(c => new {c, c.YObj})
    .ToList();

Entity Framework выяснит, как эти различные объекты связаны. Вы будете выполнять управляемое количество циклов (в данном случае 3), а полученные результаты SQL-запроса будут содержать относительно мало повторяющихся данных.

0 голосов
/ 30 июня 2011

Отключение отложенной загрузки предотвратит их загрузку. Включите отложенную загрузку и пометьте все свойства навигации как виртуальные, это позволит им быть переопределенными, чтобы можно было создавать динамические прокси. Это позволит ленивой загрузке работать должным образом. Явная загрузка также является опцией (и многие считают ее лучшей практикой кодирования).

Редактировать: О, я подумал, что это был сначала код, извините. Затем, если это поможет, поскольку Include возвращает объект запроса, вы фактически можете просмотреть их список и добавить их к себе для динамического построения запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...