繁体   English   中英

使用 Take() 到 Mysql 的 Linq 查询不会对实际查询增加限制

[英]Linq query with Take() to Mysql does not add limit to actual query

我正在使用带有 Pomelo EntityFramework 和 MySql 数据库的 net core 2.2。

以下代码:

return context.SomeTable
        .OrderByDescending(item => item.ExpiredTime)
        .Where(item => item.FinishedTime.HasValue
            && item.ExpiredTime.HasValue
            && item.ExpiredTime.Value < DateTime.UtcNow
            && item.IsArchive.GetValueOrDefault(false) == false/* is null or false*/)
        .Take(500)
        .Select(i=>new ItemWrapper(i))
        .ToArray();

返回以下 MySql:

SELECT `item`.`Id`, `item`.`ExpiredTime`, `item`.`FinishedTime`, 
`item`.`IsArchive`
FROM `SomeTable` AS `item`
WHERE (`item`.`FinishedTime` IS NOT NULL AND `item`.`ExpiredTime` IS NOT 
NULL) AND (`item`.`ExpiredTime` < UTC_TIMESTAMP())
ORDER BY `item`.`ExpiredTime` DESC

似乎Take(500)没有反映在查询中。

我希望在 sql 查询中看到limit = 500 编辑 1:我正在使用Select(i=>new ItemWrapper(i)为结果对象创建一个新类,这似乎是问题的根源。我做错了什么?

发生这种情况是因为您在Where子句中调用item.IsArchive.GetValueOrDefault(false) == false EF.Core 无法将此方法转换为 SQL,因此它首先实现所有项目,然后尝试将其余项目应用于从 SQL 服务器检索的数据。 尝试删除此条件或重写它。 顺便说一句,通常 EF.Core 会在日志中显示此类问题的警告。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM