ASP.NET Core3.0+EntityFrameWork Core3.0更新后的一个关于GroupBy的坑

Posted wzhao666

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 时一定要注意,有需要的时候,选择跟踪吧。

以上是关于ASP.NET Core3.0+EntityFrameWork Core3.0更新后的一个关于GroupBy的坑的主要内容,如果未能解决你的问题,请参考以下文章

.NET Core 3.0及ASP.NET Core 3.0 前瞻

为啥 ASP.Net Identity 不支持删除

Core3.0全局捕获异常

Core3.0全局捕获异常

Core3.0使用Caching.Memory

Core3.0类库项目引用Microsoft.AspNetCore