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

时间:2019-07-09 10:29:19

标签: mysql entity-framework asp.net-core entity-framework-core

我正在将Net core 2.2与带有MySql数据库的Pomelo EntityFramework一起使用。

以下代码:

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)为结果对象创建一个新类,这似乎是问题的根源。 我在做什么错了?

1 个答案:

答案 0 :(得分:1)

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