我的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原创,版权私有,翻载必纠。欢迎交流,转载,但要在页面明显位置给出原文连接。谢谢。 |