簡體   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