为什么实体框架会生成嵌套的SQL查询?为什么实体框架会生成嵌套的SQL查询?
我有这样的代码
var db = new Context();
var result = db.Network.Where(x => x.ServerID == serverId)
.OrderBy(x=> x.StartTime)
.Take(limit);
产生这个! (注意双select语句)
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语句?我在Code First中使用MySQL和Entity Framework。
更新我有相同的结果而不管传递给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:EXPLAIN语句
实体框架生成
'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。我不想完全重写应用程序层。
首先的嵌套查询LINQ To SQL和实体框架是不同的东西。其次为什么你认为这个查询是不好的?你做过绩效分析还是至少要解释? – Stilgar
是的我在纯SQL中手动构建它们。有2800万条记录,有毫秒vs分钟 –
对不起,Linq To SQL打字错误 –