gpt4 book ai didi

c# - 为什么 Entity Framework 会生成嵌套的 SQL 查询?

转载 作者:IT老高 更新时间:2023-10-28 23:50:02 26 4
gpt4 key购买 nike

为什么 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 with 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:解释语句

生成的 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 环境,所以我上面粘贴的时间与 rowcount explain 语句无关。我认为大约有 500,000 条记录与一个服务器 ID 匹配。

解决方案

我从 MySQL 切换到 SQL Server。我不想最终完全重写应用层。

最佳答案

这是从表达式树逻辑构建查询的最简单方法。通常性能不会成为问题。如果您遇到性能问题,您可以尝试这样的方法来恢复实体:

var results = db.ExecuteStoreQuery<Network>(
"SELECT Id, ServerID, EventId, StartTime FROM Network WHERE ServerID = @ID",
serverId);

results = results.OrderBy(x=> x.StartTime).Take(limit);

关于c# - 为什么 Entity Framework 会生成嵌套的 SQL 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13257760/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com