ASP.NET Core3.0+EntityFrameWork Core3.0更新后的一個關於GroupBy的坑


ASP.NET Core3.0終於正式更新了,調整好發布版之后,着急忙慌的開始更新新版本。

真的很艱難啊,Setup文件修改就很痛苦,一會api Router不好使了,一會Contorller也404了。。。。。。(這些坑其實也應該寫出來的,還是沒有寫博客的好習慣啊)

今天遇上的是分組問題 GroupBy 。

我有一個工作量統計圖表功能,正常情況下,選擇兩個員工,表格是下圖:

更新后,變成了下圖:

額,發生了什么????

一開始還以為是GroupBy 的工作機制變了,后來在文章 https://www.cnblogs.com/Weilence/p/10343036.html 中找到了靈感。

之前的代碼是這樣的

jobarrangements.GroupBy(j => j.Entity) //Entity是一個class

我將 class 作為Key進行分組了。對於這個圖表功能來說,我其實並不需要對 class 進行分組,直接對 Entity.Name 也就是 string 進行分組就行了,經過測試,原來的代碼將Key改為 Entity.Name確實可以得到正確圖表

但是為何之前的方法行不通了呢?

還好我看了EF Core3.0的更新文檔,想起來了這個問題的原因。

https://docs.microsoft.com/zh-cn/ef/core/what-is-new/ef-core-3.0/breaking-changes#no-tracking-queries-no-longer-perform-identity-resolution

無跟蹤查詢不再執行標識解析

新行為

從 EF Core 3.0 開始,當在返回的圖中的不同位置遇到具有給定類型和 ID 的實體時,將創建不同的實體實例。 例如,上面的查詢現在將為每個 Product 返回新的 Category 實例,即使兩個產品與同一類別關聯。

我的EF代碼(一部分)是這樣的

var jobarrangements = await query.AsNoTracking().ToListAsync();

 AsNoTracking 的行為改變了,以前是一個實例,現在變成一大堆實例了,所以圖表變樣了。以本文圖表為例,之前 jobarrangements 有若干個,但是其中的 Entity 只有兩個,現在 Entity的數量等於jobarrangements的數量了,所以必然出現問題。

如果跟蹤會如何呢?就是去掉 AsNoTracking

答案是:采用跟蹤查詢替代無跟蹤查詢也可以得到正確結果

總結

1、 GroupBy 的Key選擇應該盡量最小化,盡量不要以 class 作為Key;

2、由於EF Core3.0的更改,在使用 AsNoTracking 時一定要注意,有需要的時候,選擇跟蹤吧。


免責聲明!

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



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