为什么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与Code First。
更新
无论传递给 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 语句时,它永远不会超过一秒钟。也许还有其他问题,因为我对数据库不是太熟悉...
更新三:解释语句
实体框架生成的。
'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条记录匹配一个服务器ID。
解决方案
我从MySQL切换到SQL Server。我不想彻底重写应用程序层。