为什么实体框架会生成嵌套 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
我应该改变什么才能产生一个选择语句?我将 MySQL 和实体框架与 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 语句时,它永远不会超过一秒钟。也许我还有其他事情正在发生;我在问,因为我不太喜欢 DB...
更新 3:解释语句
生成的实体框架
'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 环境,所以我上面粘贴的时间与 rowcount 解释语句无关。我认为大约有 500,000 条记录与一个服务器 ID 匹配。
解决方案
我从 MySQL 切换到 SQL Server。我不想最终完全重写应用程序层。