我的ORM之六-- 批量

我的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 的记录。

 

posted @ 2015-05-26 14:44  NewSea  阅读(1681)  评论(0编辑  收藏  举报