[英]Why does the query take a long time in mysql even with a LIMIT clause?
[英]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.