我的ORM之六-- 批量
很多时候,批量方案是解决性能的关键
批量插入
SqlBulkCopy
利用 SqlBulkCopy 是性能最高的方式
实现:
var s = dbr.Menu.NewMyOqlSet(); s.AddRow(o => o.Id == 1 & o.Name == "33"); s.AddRow(o => o.Id == 2 & o.Name == "444"); s.BulkCopy2Db();
Insert2Db 方法:(内部调用BeginBatchInsert 方法)
var set = dbr.Menu.NewMyOqlSet(); set.Columns = new Columns(dbr.Menu.Name).ToArray(); set.AddRow(o => o.Name == "33"); set.AddRow(o => o.Name == "444"); set.Insert2Db();
BeginBatchInsert:
var set = dbr.Menu.BeginBatchInsert(dbr.Menu.Name); set.Insert(o => o.Name == "33"); set.Insert(o => o.Name == "444"); set.Execute();
生成如下SQL:
insert into [S_Menu] ([Name]) output inserted.[ID] values ('33'),('444');
批量更新
Update2Db:(内部调用 BeginBatchUpdate)
var s = dbr.Menu.NewMyOqlSet(); s.AddRow(o => o.Id == 1 & o.Name == "33"); s.AddRow(o => o.Id == 2 & o.Name == "444"); s.Update2Db(o => o.CorpID == 1, o => new SimpleColumn[] { o.Id }, o => new SimpleColumn[] { o.Name });
Update2Db方法中的
第一个参数是 Where 的条件,表示一个基本的数据约束,用于防止数据污染。可以为 null
第二个参数表示关联的唯一列
第三个参数是 更新时设置的列。
BeginBatchUpdate方法
var beg = dbr.Menu.BeginBatchUpdate(o=>o.CorpID == 1 ,o=>o.Id); beg.Update(o => o.Name == "33" & o.Id == 1 ); beg.Update(o => o.Name == "444" & o.Id == 2); beg.Execute();
生成的SQL:(MySql)
CREATE TEMPORARY TABLE `Temp_MyOql_16`( `PID` int,`Css` varchar(50), `Url` varchar(250), `Wbs` varchar(50), `IsLeaf` bit, `Name` nvarchar(50), `SortID` real, `Group` nvarchar(50), `IsValidate` bit, `ID` int) ENGINE=MEMORY DEFAULT CHARSET=utf8; insert into `Temp_MyOql_16`(`PID`,`Css`,`Url`,`Wbs`,`IsLeaf`,`Name`,`SortID`,`Group`,`IsValidate`,`ID`) values (null,null,null,null,null,'33',null,null,null,1), (null,null,null,null,null,'444',null,null,null,2); UPDATE `S_Menu` AS t, `Temp_MyOql_16` AS o SET t.`PID` = o.`PID`, t.`Css` = o.`Css`, t.`Url` = o.`Url`, t.`Wbs` = o.`Wbs`, t.`IsLeaf` = o.`IsLeaf`, t.`Name` = o.`Name`, t.`SortID` = o.`SortID`, t.`Group` = o.`Group`, t.`IsValidate` = o.`IsValidate` WHERE t.`CorpID` = 1 and t.`ID` = o.`ID`; drop table `Temp_MyOql_16`;
批量推送
批量推送,是结合批量更新和批量,当有一个数据集,需要更新或添加到数据库中时使用。有则更新,无则添加。
var insertType = dbr.PlatForm.CarType.NewMyOqlSet(); //insertType.添加数据 insertType.Save2Db(o => null, o => o.OtherID, true);
Save2Db方法中的
第一个参数:是更新的条件 。
第二个参数是 更新时,关联的唯一列。
第三个参数表示是否要保留 更新条件结果集 - MyOqlSet结果集。 如: 参数为false , 更新条件是 Id < 100 , MyOqlSet 结果集的Id 是 1-50 ,则删除数据库中 Id 从50到100 的记录。
![]() |
作者:NewSea 出处:http://newsea.cnblogs.com/
QQ,MSN:iamnewsea@hotmail.com 如无特别标记说明,均为NewSea原创,版权私有,翻载必纠。欢迎交流,转载,但要在页面明显位置给出原文连接。谢谢。 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端