mysql - 使用 Take() to Mysql 的 Linq 查询不会对实际查询添加限制
问题描述
我正在使用带有 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)
没有反映在查询中。
我希望limit = 500
在 sql 查询中看到。编辑1:我Select(i=>new ItemWrapper(i)
用来为结果对象创建一个新类,这似乎是问题的根源。我究竟做错了什么?
解决方案
发生这种情况是因为您正在调用item.IsArchive.GetValueOrDefault(false) == false
inWhere
子句。EF.Core 无法将此方法转换为 SQL,因此它首先实现所有项目,然后尝试将其余项目应用于从 SQL 服务器检索的数据。尝试删除此条件或重写它。顺便说一句,通常 EF.Core 在日志中显示此类问题的警告。
推荐阅读
- javascript - Ajax 在第一次调用时很好地加载库,但在第二次调用时不加载库
- xpath - 如何使用 XPath 查找一组元素中选择组的属性的最小值/最大值?
- linkedin - LinkedIn 共享帖子 URL 与参数
- arrays - 如何在以下 json 数组中获取 f1 的值为 1 - '[1,2,3,{"f1":1,"f2":[5,6]},4]' 使用内置函数
- drag-and-drop - 从一个地方拖放到另一个地方的多个地方
- mysql - 我们如何防止 MySQL 的 SQL 注入?
- actions-on-google - 允许用户在 Google Home 设备上选择任何选项
- azure-devops - 如何将 YAML 中的计划触发器与本地 Azure DevOps 2019 一起使用?
- ios - ios 13 导航控件在 CNContactViewController 中向下滑动选择器以添加个人资料图片时消失?
- html - CodeMirror - 格式化 HTML 自闭标签?