Оптимизация нескольких запросов LINQ to Entity Framework - PullRequest
1 голос
/ 25 октября 2010

У меня есть 2 набора сущностей Entity Framework с отношением «многие ко многим» (скомпрометированы из 3 таблиц БД). В качестве примера, скажем, у меня есть сущность Worker и сущность Company, где каждый работник может работать в нескольких компаниях, а каждая компания может иметь много работников.

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

Я уверен, что это можно сделать лучше и лучше оптимизировать. Любая помощь будет оценена.

Спасибо.

Ответы [ 2 ]

1 голос
/ 25 октября 2010

Если в вашей таблице присоединения нет дополнительной информации (только идентификаторы работника и компании), в вашей модели должно быть только два объекта: Worker и Company.Если в EF 4 граф сущностей загружен по умолчанию, то, если вы не включите LazyLoading, выполнив (context.ContextOptions.LazyLoadingEnabled = true;), вы получите списки вашей компании, когда ваш запрос для работников:

var workers = context.Workers.ToList();
// Companies already loaded - do something with them
var companiesForWorker0 = workers[0].Companies;  // Don't forget to check 
...                                              // for null in real code

Вы также можете напрямуюскажите EF, что нужно загружать компании при запросе рабочих (это было бы необходимо, если включена LazyLoading):

var workers = context.Workers.Include("Companies").ToList();
0 голосов
/ 25 октября 2010

Вот что я делаю в Linq2SQL и, возможно, вам подойдет.

  1. Сделать запрос №1.
  2. Соберите все рабочие идентификаторы в списке.
  3. Используйте этот список для перехода к дополнительному запросу (другими словами where list.Contains(item)).

Теперь нужно выполнить только 2 запроса.

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

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