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的更新文檔,想起來了這個問題的原因。
無跟蹤查詢不再執行標識解析
新行為
從 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 時一定要注意,有需要的時候,選擇跟蹤吧。