Почему Entity Framework генерирует вложенные SQL-запросы?
У меня есть этот код
var db = new Context();
var result = db.Network.Where(x => x.ServerID == serverId)
.OrderBy(x=> x.StartTime)
.Take(limit);
Что порождает это! (Обратите внимание на оператор двойного выбора)
SELECT
`Project1`.`Id`,
`Project1`.`ServerID`,
`Project1`.`EventId`,
`Project1`.`StartTime`
FROM (SELECT
`Extent1`.`Id`,
`Extent1`.`ServerID`,
`Extent1`.`EventId`,
`Extent1`.`StartTime`
FROM `Networkes` AS `Extent1`
WHERE `Extent1`.`ServerID` = @p__linq__0) AS `Project1`
ORDER BY
`Project1`.`StartTime` DESC LIMIT 5
Что следует изменить, чтобы в результате получилось одно предложение select? Я использую MySQL и Entity Framework с кодом First.
Update
У меня тот же результат, независимо от типа параметра, переданного методу OrderBy()
.
Обновление 2: Сроки
Total Time (hh:mm:ss.ms) 05:34:13.000
Average Time (hh:mm:ss.ms) 25:42.000
Max Time (hh:mm:ss.ms) 51:54.000
Count 13
First Seen Nov 6, 12 19:48:19
Last Seen Nov 6, 12 20:40:22
Необработанный запрос:
SELECT `Project?`.`Id`, `Project?`.`ServerID`, `Project?`.`EventId`, `Project?`.`StartTime` FROM (SELECT `Extent?`.`Id`, `Extent?`.`ServerID`, `Extent?`.`EventId`, `Extent?`.`StartTime`, FROM `Network` AS `Extent?` WHERE `Extent?`.`ServerID` = ?) AS `Project?` ORDER BY `Project?`.`Starttime` DESC LIMIT ?
Я использовал программу для выполнения моментальных снимков из текущего процесса в MySQL.
Другие запросы выполнялись одновременно, но когда я изменяю его только на один оператор SELECT, он НИКОГДА не проходит более одной секунды. Возможно, у меня есть что-то еще, что происходит; Я спрашиваю, потому что я не так в БД...
Обновление 3: инструкция объяснения
Создана структура Entity Framework
'1', 'PRIMARY', '<derived2>', 'ALL', NULL, NULL, NULL, NULL, '46', 'Using filesort'
'2', 'DERIVED', 'Extent?', 'ref', 'serveridneventid,serverid', 'serveridneventid', '109', '', '45', 'Using where'
Один вкладыш
'1', 'SIMPLE', 'network', 'ref', 'serveridneventid,serverid', 'serveridneventid', '109', 'const', '45', 'Using where; Using filesort'
Это из моей среды QA, поэтому время, которое я вставил выше, не связано с операторами объяснения строки. Я думаю, что есть около 500 000 записей, которые соответствуют одному идентификатору сервера.
Решение
Я переключился с MySQL на SQL Server. Я не хочу полностью переписывать прикладной уровень.