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

时间: 2024-10-29 10:08:51

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

解决ASP.NET Core部署到IIS,更新项目"另一个程序正在使用此文件,进程无法访问"

问题:部署到IIS上的ASP.NET Core项目,在更新的时候会进程占用的错误 初步解决方案: 1,关闭应用程序池 2,关闭网站 3,更新项目 缺点:网站没法访问,部署项目停的时间过长 查询官方文档后,官方给出的方案: 结合官方文档,找到了一个目前看算是比较好的解决方案(一定要看底部的特别注意) 好点的解决方案(一次配置后,1秒钟更新): 1,在D盘根目录创建一个app_offline.htm文件,注意是.htm文件,不是.html 2,创建一个待发布文件夹,把需要更新的项目文件放到该目录下

主攻ASP.NET.4.5.1 MVC5.0之重生:在项目中使用zTree jQuery 树插件

效果图和json格式 Controllers代码 using HR.Models; using HR.Models.Repository; /************************************************************************************ * 命名空间:HR.Controllers * Controller: TreeController * 版本号: F 1.0.0.0 * 负责人: Markfan * 电子邮箱:[ema

EntityFramework 7.0之初探【基于VS 2015】(十)

前言 本篇作为EF 7.0的开篇也是Entity Framework目前系列末篇,因为关于EF 7.0学习资料实在是太少,我都是参考老外的资料花费了不少时间去研究去尝试同时也失败多次,个人觉得那是值得的,至少为今后在VS2015上来运用EF 7.0打下了坚定的基础,但是有些很深入的层面还得待EF 7.0比较成熟时再来补充及学习,当然在前面EF 6.0或6.1中系列中如果我发现又有好的内容也会进行适当补充同时也和大家一起学习以及分享.文中若有不妥之处或错处请指出.[注意]下面所演示代码都是基于VS

Asp.Net MVC4.0 官方教程 入门指南之四--添加一个模型

Asp.Net MVC4.0 官方教程 入门指南之四--添加一个模型 在这一节中,你将添加用于管理数据库中电影的类.这些类是ASP.NET MVC应用程序的模型部分. 你将使用.NET Framework框架下的实体框架(Entity Framework)数据访问技术,与模型类协同工作.实体框架(常简称为EF)支持一种称之为编码先行(Code First)的开发模式.编码先行使你通过编写简单的类(简称为POCO类,全称为"plain-old CLR objects."),来创建模型对象

ASP.Net MVC3安全升级导致程序集从3.0.0.0变为3.0.0.1

开发环境一般引用的是本机 C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET MVC 3\Assemblies下的System.Web.Mvc.dll,当系统更新时,此文件会更新为高级版本,从而和已经部署到服务器上的System.Web.Mvc.dll版本不一致.从能在线上运行时报下面的错误: Assembly 'TestUnsafe, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' us

ASP.NET.4.5.1+MVC5.0系统角色和权限讲解

细说ASP.NET.4.5.1+MVC5.0系统角色和权限 MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑.MVC被独特的发展起来用于映射传统的输入.处理和输出功能在一个逻辑的图形化用户界面的结构中. 1.在项目中新建文件夹Helpers 2.在HR.

使用EntityFrameWork 5.0增删查改(&分页,连表)

   EntityFrameWork 5.0的简单使用 概要: 使用EF增加,删除,编辑以及查询,分页,连表等等 正文: 在项目中添加一下Entiy Data Model: xx.context.tt下的xx.context.cs: 这里的OrderSystemEntities(OrderSystem是数据库名)就是EF的上下文容器对象,继承至DbContext 在OrderSystemEntities中调用DbContext的构造函数DbContext(string connectionNam

主攻ASP.NET.4.5.1 MVC5.0之重生:创建UIHelper通用自定义分页和选择开关与PagesHelper和IsSelect简单用法

@helper放入地方 分页效果 选择开关编辑调用 <dl> <dd class="dc1">是否主管:</dd> <dd> @UIHelper.IsSelect("IsManager",Model.IsManager.ToString()); </dd> </dl> 分页调用 <div class="rg5"> @UIHelper.PagesHelper(Vie

全新的闪念胶囊,OneStep 1.5 以及 BigBang 2.0 更新后的 Smartisan OS 3.6 体验

本文标签: OneStep1.5 BigBang2.0 SmartisanOS3.6 闪念胶囊 随着坚果手机的发布,Smartisan OS 也得到了例行更新.包括了全新的闪念胶囊,OneStep 1.5以及 BigBang 2.0更新.趁着坚果还热,来了解老罗在发布会上用一个小时讲解的「领先三步」使用体验如何. 闪念胶囊:屏幕边缘的便利贴 闪念胶囊的使用门槛就像发送微信语音一样低:按住说话,文字输入,或者使用 OneStep拖动新建胶囊.从屏幕右边划出即可查看这些胶囊,这些操作都在全局有效.