У меня есть модель Entity Framework 4 с 2 сущностями, содержащими отношение многие ко многим, поэтому 3 таблицы, [Q], [P] и [Q2P] -кросс-таблица Запуск кода как:
context.Q.Include("P");
Результаты в течение долгого времени ожидания (я ждал около 5 минут, а затем прервал его). Затем я проверил сгенерированный SQL и нашел это:
SELECT *
FROM ( SELECT *
FROM [Q] AS [Extent1]
LEFT OUTER JOIN (SELECT *, CASE WHEN ([Join1].[Id] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C2]
FROM [Q_P] AS [Extent2]
INNER JOIN [P] AS [Extent3] ON [Extent3].[Id] = [Extent2].[Id] ) AS [Join1] ON [Extent1].[Id] = [Join1].[Id]
) AS [Project1]
ORDER BY [Project1].[Id] ASC, [Project1].[C2] ASC
Я не могу скрыть свой сюрприз, это WTF? Обычный SQL-запрос «многие ко многим»
select * from [q2p]
join [q] on qId=q.Id
join [p] on pId=p.Id
выполняется менее чем за 1 мс, а EF-запрос выполняется вечно.