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

时间:2019-11-12
本文章向大家介绍ASP.NET Core3.0+EntityFrameWork Core3.0更新后的一个关于GroupBy的坑,主要包括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 时一定要注意,有需要的时候,选择跟踪吧。

原文地址:https://www.cnblogs.com/wzhao666/p/11840722.html