Entity Framework отношения «многие ко многим» включают чрезвычайно медленные - PullRequest
4 голосов
/ 25 декабря 2010

У меня есть модель 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-запрос выполняется вечно.

Ответы [ 2 ]

3 голосов
/ 25 декабря 2010

Да, это не секрет, что это занимает много времени, пожалуйста, проголосуйте за соединение , которое я открыл около года назад.

Однако 5 минут - это определенно не то, что нужно.

Попробуйте отделить выполнение от генерации запроса и используйте ToTraceString, чтобы узнать, сколько времени потребуется для определения времени генерации запроса.

Стремительная загрузка не так уж и важна в текущей версии, они сказали, что планируют снизить стоимость в будущем.

В любом случае, вы можете использовать хранимые процедуры или создать свои собственные ObjectQueries.

См:
- http://msdn.microsoft.com/en-us/library/bb896241.aspx
- http://msdn.microsoft.com/en-us/library/bb896238.aspx

2 голосов
/ 26 декабря 2010

Я перешел на Nhibernate.

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