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的更新文档,想起来了这个问题的原因。
无跟踪查询不再执行标识解析
新行为
从 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
- 【Dev Club分享】JSPatch成长之路
- Node.js新手必须知道的4个JavaScript概念
- 博客文章重新启用评论,附一键填写评论中用户信息代码生成工具
- 提升 Node.js 应用性能的 5 个技巧
- 再次扩散:Linux系统bash漏洞CVE-2014-6271仍未被彻底修复,红帽再发补丁
- SEO分享:彻底禁止搜索引擎收录非首选域名的方法
- 紧急扩散:Linux系统bash严重安全漏洞CVE-2014-6271的检测及修复方法
- 手游热更新方案xLua开源:Unity3D下Lua编程解决方案
- WordPress评论滑动/拉链解锁myQaptcha代码版及部署方法
- 修改WordPress分类目录和页面链接以斜杠/结尾,附nginx对应的301跳转设置方法
- 彻底弄懂 Http 缓存机制 - 基于缓存策略三要素分解法
- 解决Crayon Syntax Highlighter代码高亮与fancybox图片暗箱冲突问题
- 移动搜索SEO:网站移动适配之Meta标注、移动跳转终结篇
- http加速器Varnish的vcl配置小记(lnmp环境)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 硬件设计之 Distributed Arithmetic 一例
- JavaScript 框架学习(JQuery)
- MongoDB 部署
- 结构体对齐原则在自定义协议解析时的妙用之法
- Spring JDBC 框架一个最简单的Hello World级别的例子
- Celery 分布式框架 学习
- .NET Core + K8S + Loki 玩转日志聚合
- varint是啥你真的知道么?
- 一篇文章带你入门移动安全
- Could not load JDBC driver class [com.mysql.jdbc.Driver]
- [Bazel]自定义规则实现将多个静态库合并为一个动态库或静态库
- [Golang]包管理
- Power Query中避免出错的几种情况
- 我的开发日记(十五)
- 常见未授权访问漏洞总结