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 时一定要注意,有需要的时候,选择跟踪吧。
原文地址:https://www.cnblogs.com/wzhao666/p/11840722.html