EF Core 7.0 新特性之批量修改
概要
EF Core 7.0 提供了一个可以将LINQ查询和批量修改相结合的方法ExecuteUpdate。由于数据修改是以批量更新的方式完成,所以可以减少数据库的往返次数。
本文将主要介绍ExecuteUpdate的使用方法。
代码和实现
基本案例
本文我们使用银行分行,ATM机和分行经理三张数据表,关系如下,类定义请见附录:
- 一个分行拥有若干台ATM机
- 一台ATM机只能隶属于一个分行
- 一个分行只拥有一名分行经理
- 一个人只能做一个分行的经理
批量更新之单表操作
我们在所有IsDeleted 为true,即已经关闭的分行, 将它们的名称前面加上字符串 Decommissioned
EF CORE代码如下:
public async Task<int> UpdateBranchSingleTable()
{return await _context.Set<Branch>().Where(b => b.IsDeleted == true).ExecuteUpdateAsync(b => b.SetProperty(p => p.Name, m => "Decommissioned" + m.Name + "!"));
}
生成的SQL代码如下:
UPDATE [t]SET [t].[Name] = (N'Decommissioned' + [t].[Name]) + N'!'FROM [tt_branch] AS [t]
WHERE [t].[IsDeleted] = CAST(1 AS bit)
生成的是批量更新的SQL语句。
批量更新之多表操作
Case 1 查询拥有支持外币操作ATM机的分行,并将分行名称前面标注支持外币业务。
public async Task<int> UpdateBranchFormMultipleTable(){return await _context.Set<Branch>().Where(b => b.IsDeleted == false && b.Atms.Any(a => a.SupportForeignCurrency == true)).ExecuteUpdateAsync(b => b.SetProperty(p => p.Name, m => "Global Service " + m.Name)); }
Case 2 查询分行经理title是BranchManager的分行,并将这些分行的名称前面增加Level 2。
public async Task<int> UpdateBranchMultipleTables() {return await _context.Set<Branch>().Where(b => b.IsDeleted == false && b.Manager.Title == "BranchManager").ExecuteUpdateAsync(b => b.SetProperty(p => p.Name, m => "Level 2" + m.Name));}
生成的SQL代码如下:
UPDATE [t]SET [t].[Name] = N'Level 2' + [t].[Name]FROM [tt_branch] AS [t]INNER JOIN [tt_user] AS [t0] ON [t].[Id] = [t0].[Id]
WHERE [t].[IsDeleted] = CAST(0 AS bit) AND [t0].[Title] = N'BranchManager'
我们看到,SQL是基于联表操作以后再进行的过滤和更新。这样看,通过Dapple等半自动ORM框架,自己完成的SQL语句和通过EF Core生成的SQL没有任何区别。
附录
实体类定义
public class Entity
{[Key][DatabaseGenerated(DatabaseGeneratedOption.Identity)]public int Id { get; set; }[Timestamp]public byte[]? Rowversion { get; set; }public bool IsDeleted { get; set; }
}[Table("tt_branch")]public class Branch : Entity{[Required]public string Name { get; set; } = string.Empty;[Required]public string Address { get; set; } = string.Empty;[Required]public bool hasCreditCardService { get; set; } = false;[Required]public bool hasChequeService { get; set; } = false;public ICollection<ATM> Atms { get; } = new List<ATM>();public User Manager { get; set; } = null!;
}
public abstract class BankDevice : Entity
{[Required]public string Name { get; set; } = string.Empty;[Required]public DeviceStatus DeviceStatus { get; set; } = DeviceStatus.Running;}[Table("tt_atm")]public class ATM : BankDevice{[Required]public bool SupportForeignCurrency { get; set; } = false;}
public enum DeviceStatus
{Running = 1,Standby,Maintance
}[Table("tt_user")]
public class User:Entity
{public string FirstName { get; set; }public string LastName { get; set; }public string Title { get; set; }public Branch Branch { get; set; } = null!;
}
实体关系定义
protected override void OnModelCreating(ModelBuilder modelBuilder)
{modelBuilder.Entity<Branch>().HasMany(x => x.Atms).WithOne().HasForeignKey("BranchId").IsRequired();modelBuilder.Entity<Branch>().HasMany(x => x.Cdms).WithOne().HasForeignKey("BranchId").IsRequired();modelBuilder.Entity<Branch>().HasMany(x => x.MCAtms).WithOne().HasForeignKey("BranchId").IsRequired();modelBuilder.Entity<Branch>().HasOne(x => x.Manager).WithOne(x => x.Branch).HasForeignKey<Branch>();}
相关文章:
EF Core 7.0 新特性之批量修改
概要 EF Core 7.0 提供了一个可以将LINQ查询和批量修改相结合的方法ExecuteUpdate。由于数据修改是以批量更新的方式完成,所以可以减少数据库的往返次数。 本文将主要介绍ExecuteUpdate的使用方法。 代码和实现 基本案例 本文我们使用银行分行,ATM机…...
Vue_Bug error0308010Cdigital envelope routinesunsupported
Bug描述: error0308010Cdigital envelope routinesunsupported 解决方法: Just add this to the top of vue.config.js : const crypto require(crypto);/*** md4 algorithm is not available anymore in NodeJS 17 (because of lib SSL 3).* In that…...
中科院提出“思维传播”,极大增强ChatGPT等模型复杂推理能力
中国科学院自动化研究所与耶鲁大学计算机系研究人员联合发布了,一份名为《思维传播:用大型语言模型进行基于类比的复杂推理》的论文。 ChatGPT等大型语言模型展示出了超强的创造能力,只需简单的文本提示就能生成小说、营销创意、简历等各种文本内容。但…...
ubuntu20.04安装opencv 3.2.0 报错
安装记录 Error 1: cmake时报错 CMake Error at cmake/OpenCVCompilerOptions.cmake:21 (else): A duplicate ELSE command was found inside an IF block. Fix: 修改opencv-3.2.0/cmake/OpenCVCompilerOptions.cmake文件 注释掉21和22行 else()message(STATUS "Unabl…...
KubeVela交付
有什么用我也不想说了,这个是k8s CI/CD,进阶玩家玩的了,比你们喜欢Arg CD更科学,更现代 在 Kubernetes 中安装 KubeVela helm repo add kubevela https://charts.kubevela.net/core helm repo update helm install --create-namespace -n v…...
【SpringCloud-10】SCA-nacos
前言: 前面介绍的springcloud,可以看做第一代,称为:SCN(spring cloud Netflix); 接下来介绍的是第二代:SCA(spring cloud alibaba); SCA主要有以下组件&#…...
卡顿分析与布局优化
卡顿分析与布局优化 大多数用户感知到的卡顿等性能问题的最主要根源都是因为渲染性能。Android系统每隔大概16.6ms发出VSYNC信 号,触发对UI进行渲染,如果每次渲染都成功,这样就能够达到流畅的画面所需要的60fps,为了能够实现60fp…...
【Vivado HLS Bug】Ubuntu环境下Vivado HLS导出IP报错:HLS ERROR: [IMPL 213-28]
Export IP Invalid Argument / Revision Number Overflow Issue (Y2K22) (xilinx.com)一.问题描述: 在Ubuntu20.04环境中使用Vivado HLS导出IP时报错:HLS ERROR: [IMPL 213-28] 二.解决方法: 1.从如下链接中下载官方补丁Export IP Invalid…...
2022最新版-李宏毅机器学习深度学习课程-P14 批次(batch)与动量(momentum)
一、batch 回顾epoch、shuffle batch size大还是小?都有好处 大batchsize的好处 由于GPU有并行计算的能力,左边并不一定用时更长 反而是,batch size小的时候,要跑完一个epoch所用的update时间更长,所以时间方面的比较…...
谜题(Puzzle, ACM/ICPC World Finals 1993, UVa227)rust解法
有一个5*5的网格,其中恰好有一个格子是空的,其他格子各有一个字母。一共有4种指令:A, B, L, R,分别表示把空格上、下、左、右的相邻字母移到空格中。输入初始网格和指令序列(以数字0结束),输出指…...
acwing算法基础之数据结构--双链表
目录 1 知识点2 模板 1 知识点 一般的结构体写法为, struct BiListNode {int val;BiListNode *left;BiListNode *right; };但我们不用这个,而用数组模拟双链表,此时,用编号为0的结点表示头结点,用编号为1的结点表示尾…...
将中文名格式化输出为英文名
要求: 编写Java程序,输入样式为:Zhong wen ming的人名,以 Ming,Zhong.W 的形式打印出来。其中.W是中间单词的首字母;例如输入”Willian Jefferson Clinton“,输出形式为:Clinton,Willian.J public static …...
设计模式_迭代器模式
迭代器模式 介绍 设计模式定义案例迭代器模式行为型:关注对象与行为的分离 提供了一种统一的方式来访问多个不同的集合两个集合:使用了不同的数据存储方式 学生 和 警察 查询显示出集合的内容 ,使用相同的代码 问题堆积在哪里解决办法不同…...
【数据结构】:栈的实现
1 栈 1.1栈的概念及结构 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则 压栈…...
微前端一:技术选型
微前端是一种多个团队通过独立发布功能的方式来共同构建现代化 web 应用的技术手段及方法策略。 微前端架构具备以下几个核心价值: 1、技术栈无关 主框架不限制接入应用的技术栈,微应用具备完全自主权 2、独立开发、独立部署 微应用仓库独立࿰…...
FPGA project : flash_continue_write
本实验学习了通过spi通信协议,驱动flash;完成连续写操作。 连续写: 本质上还是页编程指令,两种连续写的方式: 1,每次只写1byte的数据。 2,每次写满1页数据,计算剩余数据够不够写…...
论文阅读:Rethinking Range View Representation for LiDAR Segmentation
来源ICCV2023 0、摘要 LiDAR分割对于自动驾驶感知至关重要。最近的趋势有利于基于点或体素的方法,因为它们通常产生比传统的距离视图表示更好的性能。在这项工作中,我们揭示了建立强大的距离视图模型的几个关键因素。我们观察到,“多对一”…...
本地配置免费的https咋做?
大家好这里是tony4geek。 今天和公司的小伙伴对接项目,因为涉及到https的权限调用。所以在服务器本地localhost 要配置https用来测试 。现在把过程中遇到的问题记录下来。 • 因为是测试用所以生成https的证书用免费的就可以了。 openssl req -x509 -nodes -days …...
微信小程序框架---详细教程
🎬 艳艳耶✌️:个人主页 🔥 个人专栏 :《Spring与Mybatis集成整合》《Vue.js使用》 ⛺️ 越努力 ,越幸运。 目录 1.框架 1.1响应的数据绑定 1.2.页面管理 1.3.基础组件 1.4.丰富的 API 2.视图层 View 2.1.介绍 …...
【LeetCode刷题(数组and排序)】:存在重复元素
给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返回 false 示例 1: 输入:nums [1,2,3,1] 输出:true 示例 2: 输入:nums [1,2…...
3分钟掌握视频转PPT终极技巧:快速提取幻灯片内容
3分钟掌握视频转PPT终极技巧:快速提取幻灯片内容 【免费下载链接】extract-video-ppt extract the ppt in the video 项目地址: https://gitcode.com/gh_mirrors/ex/extract-video-ppt 还在为会议录屏中的PPT幻灯片提取而烦恼吗?extract-video-pp…...
电机控制进阶:从增量式与位置式PID到现代复合控制策略
1. PID控制的前世今生:从工业革命到智能时代 第一次接触PID控制器时,我被这个诞生于上世纪30年代的"古董级"算法震惊了。当时正在调试一台伺服电机,系统总是出现超调和振荡。导师递给我一张写着三个参数的纸条:"试…...
AI 创作者指南:06.AI 视频创作:脚本、镜头语言与自动化
第 6 篇|AI 视频创作:脚本、镜头语言与自动化 视觉DNA刚建好,你是不是已经开始用AI画封面、插图玩得停不下来了?😊 来,第二部分最后一篇——第6篇|AI 视频创作:脚本、镜头语言与自动化。 以前拍视频得找团队、剪半天,现在AI帮你从脚本到成片一键流水线。节奏和叙事才…...
智能配置黑苹果:三步快速部署OpenCore自动化工具终极指南
智能配置黑苹果:三步快速部署OpenCore自动化工具终极指南 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 还在为黑苹果复杂的EFI配置而头疼…...
requests - 简单好用的HTTP请求库
一、什么是requests? requests 是一个用于发送HTTP请求的 Python 库。 它可以帮助你: 轻松发送GET、POST、PUT、DELETE等请求处理Cookie、会话等复杂性自动解压缩内容处理国际化域名和URL 二、应用场景 requests 广泛应用于以下实际场景:…...
5个步骤快速搭建医院信息系统:终极医疗数字化解决方案
5个步骤快速搭建医院信息系统:终极医疗数字化解决方案 【免费下载链接】HIS ZainZhao/HIS: HIS 通常代表医疗信息系统(Hospital Information System),但此链接指向的具体项目信息未知,可能是某个开发者设计或维护的医院…...
3分钟搞定Windows启动盘制作:WinDiskWriter让macOS用户告别复杂命令行
3分钟搞定Windows启动盘制作:WinDiskWriter让macOS用户告别复杂命令行 【免费下载链接】windiskwriter 🖥 A macOS app that creates bootable USB drives for Windows. 🛠 Patches Windows 11 to bypass TPM and Secure Boot requirements. …...
突破系统限制:Mac Mouse Fix如何重新定义第三方鼠标体验
突破系统限制:Mac Mouse Fix如何重新定义第三方鼠标体验 【免费下载链接】mac-mouse-fix Mac Mouse Fix - A simple way to make your mouse better. 项目地址: https://gitcode.com/GitHub_Trending/ma/mac-mouse-fix 在macOS生态系统中,第三方鼠…...
中老年人腰椎退行性病变,养护比治疗更重要
随着年龄增长,人体骨骼、关节会逐渐老化,腰椎退行性病变成为中老年人的常见问题,主要表现为腰椎间盘退变、椎间隙狭窄、骨质增生、腰椎不稳等,可引发腰部疼痛、下肢麻木、活动受限等症状,严重影响中老年人的生活质量。…...
告别手动回复!用Python+uiautomation给微信PC版做个关键词自动回复机器人
用Python打造微信PC版智能应答机器人:从消息监控到自动化交互 每次打开微信都被海量消息淹没?客服咨询重复率高达70%?社群运营每天机械回复相同问题?这些场景背后隐藏着一个共同痛点——低效重复劳动正在吞噬现代人的生产力。今天…...
