EF Core 3.0 Preview 9 的2個小坑


之前我們的數據庫服務器使用的是 SQL Server 2008 R2 ,由於從 EF Core 3.0 Preview 6 開始不支持 UseRowNumberForPaging ,只能停留在 EF Core 3.0 Preview 5 ,無法繼續升級。后來終於將數據庫升級到了 SQL Server 2016 ,趕緊將 EF Core 升級到最新版 3.0 Preview 9 ,結果卻發現了 EF Core 3.0 Preview 9 的2個小坑(3.0 正式版中也存在)。

第1個小坑

EF Core 3.0 會生成的多余 IS NOT NULL ,讓生成的 SQL 語句非常啰嗦,冗長得不忍目睹。

SELECT ...
FROM [blog_Content] AS [b]
WHERE ((((([b].[BlogID] = @__blogId_0) AND @__blogId_0 IS NOT NULL) AND ([b].[IsExist] = CAST(1 AS bit))) AND (((([b].[PostType] | @__type_1) = @__type_1) AND ([b].[PostType] | @__type_1 IS NOT NULL AND @__type_1 IS NOT NULL)) OR ([b].[PostType] | @__type_1 IS NULL AND @__type_1 IS NULL))) AND (((([b].[PostConfig] & @__config_2) = @__config_2) AND ([b].[PostConfig] & @__config_2 IS NOT NULL AND @__config_2 IS NOT NULL)) OR ([b].[PostConfig] & @__config_2 IS NULL AND @__config_2 IS NULL)))

github 上的相關 issue: Queries really slow due to null checks

注:這個坑坑人不淺,會造成 SQL Server 數據庫 CPU 100% ,詳見 阿里雲 RDS 數據庫又發 CPU 近 100% 的“芯臟病”

第2個小坑

EF Core 3.0 對 Projection 的支持有問題,不管 Mapster 的 ProjectToType 還是 AutoMapper 的 ProjectTo ,生成的 SQL 語句中 SELECT 的是實體的字段,而不是 DTO 的字段,比如下面的 SQL 語句。

SELECT DTO字段
FROM (
    SELECT TOP(@__p_3) 實體字段
    FROM [blog_Content] AS [b]
    LEFT JOIN [blog_DiggScore] AS [b0] ON [b].[Id] = [b0].[EntryID]
    WHERE ...
    ORDER BY [b0].[DiggCount] DESC
) AS [t]
LEFT JOIN [blog_DiggScore] AS [b1] ON [t].[Id] = [b1].[EntryID]
ORDER BY [t].[DiggCount] DESC

后來同事排查后發現,把 ProjectToType 移動到 OrderBy 以及 Take/Skip 語句之前可以避開這個問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM