2013-07-10 2 views
1

я использую Ef5 Code First и имеют такой запрос, как это:Split запрос с включает в несколько запросов

 var query = DbSet.Include(ent => ent.Websites) 
      .Include(ent => ent.Addresses) 
      .Include(ent => ent.IndustryType) 
      .Include(ent => ent.Factors) 
      .Include(ent => ent.Factors.Select(fact => fact.Objectives)) 
      .Include(ent => ent.DmpNodes) 
      .Include(ent => ent.DmpNodes.Select(node => node.DmpNodeConnections)); 

Если я использую более 4 включает в себя, запрос выполняется очень медленно. Я уже знаю, почему это так.

Я мог бы опустить, например. DmpNodes включают и загружают это свойство навигации с ленивой загрузкой, но это приведет к сотням запросов.

Я ищу способ разделить этот запрос, чтобы я мог сначала загрузить объекты, например. Адреса, IndustryType и Factors. А второй запрос заполняет эти объекты остальным.

Возможно ли это или есть другое хорошее решение?

+0

ЕСЛИ вы делаете отдельные запросы, которые используют один и тот же контекст, EF автоматически объединяет связанные объекты в памяти. – MaxSC

+0

Не могли бы вы показать мне, как это выглядит в коде? В конце мне нужны объекты сущности со всеми свойствами навигации, заполненными. – RolandG

+0

Ну, просто напишите тест на вашей стороне. Выберите веб-сайты, а затем адреса в отдельном запросе, используя тот же контекст, и посмотрите, правильно ли заполнены свойства навигации! – MaxSC

ответ

1

Если вы выполняете отдельные запросы L2E, которые используют один и тот же контекст, EF автоматически объединяет связанные объекты в памяти.

Просто напишите тест на вашей стороне. Выберите Websites, а затем Addresses в отдельном запросе, используя тот же контекст и свойства навигации, будет заполнен правильно!

+0

Обмен контекстом среди запросов - это плохая идея. Использование этого для получения связанных объектов - еще более плохая идея, потому что это делает код зависимым от истории выполнения. Тем не менее, вы можете использовать функцию фиксации отношений в _one_ request (и контексте) путем выборочной загрузки коллекций. –

+0

Я полностью согласен с тем, что время жизни Context должно быть как можно короче. By _requests_ Я не имею в виду 'HTTPRequest', но запросы БД (запрос L2E). Я отредактировал свой ответ. – MaxSC

Смежные вопросы