Наткнулся на код Entity Framework, который создает объекты с подобъектами, используя внешние ключи из БД.
Сгенерированный SQL-запрос является немедленным, но код EF выполняется вечно ...
1.Проверил, что FK EF соответствует FK DB
2. проверил, что типы данных EF и DB совпадают
3. проверял, что у ФК есть индексы
Код EF
DAL.NachshonDBDataContext oDB = Config.GetDB();
var oQuery =
from oDALMentor in oDB.Mentors
orderby oDALMentor.User.sDisplayName
select new
{
oDALMentor,
oDALUser = oDALMentor.User,
oDALSector = oDALMentor.LU_Sector,
oDALAcademicInstitute = oDALMentor.LU_AcademicInstitute,
oDALMentoringFramework = oDALMentor.LU_MentoringFramework,
oDALMentoringCoordinator = oDALMentor.LU_MentoringCoordinator,
oDALMentorQuestionnaires = oDALMentor.MentorQuestionnaires,
oDALMentorLangs = oDALMentor.MentorLangs,
};
var result = oQuery.AsParallel().ToList(); // takes very long time
Сгенерированный SQL
SELECT * -- asterisk instead of all the generated fields
(
SELECT COUNT(*)
FROM dbo.MentorQuestionnaires AS t7
WHERE t7.gUserID = t0.gUserID
) AS value
FROM dbo.Mentors AS t0
INNER JOIN dbo.Users AS t1 ON t1.gUserID = t0.gUserID
INNER JOIN dbo.LU_Sectors AS t2 ON t2.nSectorID = t0.nSectorID
INNER JOIN dbo.LU_AcademicInstitutes AS t3 ON t3.nAcademicInstitueID =
t0.nAcademicInstituteID
INNER JOIN dbo.LU_MentoringFrameworks AS t4 ON t4.nMentoringFrameworkID =
t0.nMentoringFrameworkID
INNER JOIN dbo.LU_MentoringCoordinators AS t5 ON t5.nMentorCoordinatorID
= t0.nMentorCoordinatorID
LEFT OUTER JOIN dbo.MentorQuestionnaires AS t6 ON t6.gUserID = t0.gUserID
WHERE t1.nStatus = 1
Запрос выполняется очень быстро и извлекает 1521 строку