此文主要用做记录用:

原因:数据库迁移,需要转换大量用户资料,两数据某字段加密方式不一致需要批量转换

注:转换程序用了EntityFramework

过程:

1.读取所有需要转换数据至List

2.采用Parallel.ForEach对List进行批次数据转换

3.将转换后的List数据按一定数量进行分割为List<List<T>>

4.建立List<List<T>>相应数量Task数组

5.采用Task.Run建立写入数据库Action

5.运行所有Task[],指令为Task.WaitAll(tasks);

总结:主要是针对写入数据库进行多线程方式处理,读取目前还能忍受,当时用foreach一笔笔写入程序直接假死,半天没反应,后采用多线程写入,效果非常明显

附代码如下:

List<TableName> query;
Stopwatch watch = new Stopwatch();
watch.Start();
using (DataBaseConext db = new DataBaseConext())
{
db.Configuration.ValidateOnSaveEnabled = false;
query = db.apuser.Where(p => p.unpwd != "").ToList();
}
watch.Stop();
MessageBox.Show(String.Format("读取使用秒数:{0}", watch.Elapsed.TotalSeconds)); watch.Restart();
Parallel.ForEach<TableName>(query, p =>
{
//SomethingCode
}); watch.Stop();
MessageBox.Show(String.Format("轉換使用秒數:{0}", watch.Elapsed.TotalSeconds)); watch.Restart();
List<List<TableName>> users = new List<List<TableName>>();
int splitCount = ;
while (query.Any())
{
users.Add(query.Take(splitCount).ToList());
query = query.Skip(splitCount).ToList();
} Task[] tasks = new Task[users.Count()];
for (int ctr = ; ctr < users.Count(); ctr++)
{
var s = users[ctr];
tasks[ctr] = Task.Run(() =>
{
using (DataBaseConext db = new DataBaseConext())
{
db.Configuration.ValidateOnSaveEnabled = false;
db.Configuration.AutoDetectChangesEnabled = false;
s.ForEach(p =>
{
db.Entry<TableName>(p).State = System.Data.Entity.EntityState.Modified;
db.SaveChanges(); Debug.WriteLine(String.Format("當前線程編號:{0}", Thread.CurrentThread.ManagedThreadId));
});
}
});
}
Task.WaitAll(tasks);
watch.Stop();
MessageBox.Show(String.Format("分割及保存使用秒數:{0}", watch.Elapsed.TotalSeconds)); MessageBox.Show("完成");

EntityFramework更新多条数据【8万】的更多相关文章

  1. mysql根据查询结果批量更新多条数据(插入或更新)

    mysql根据查询结果批量更新多条数据(插入或更新) 1.1 前言 mysql根据查询结果执行批量更新或插入时经常会遇到1093的错误问题.基本上批量插入或新增都会涉及到子查询,mysql是建议不要对 ...

  2. Android数据库更新——上万条数据的插入

    在实际情况下,很可能遇到会向一个表中插入10万条数据,而这样的数据库更新,如果用寻常的方式,在SQLiteOpenHelper.onUpdate()方法中不断的执行SQL语句,那么效率是可想而知的,甚 ...

  3. 在UPDATE中更新TOP条数据以及UPDATE更新中使用ORDER BY

    正常查询语句中TOP的运用: SELECT TOP 1000 * FROM MP_MemberGrade   随意更新一张表中满足条件的前N条数据: UPDATE TOP (1) MP_Member ...

  4. knockout更新列表中的某条数据,knockout.js绑定数组时更新其中一条数据

    knockout是一款前端实现MVVM的JS框架,仅knockout.js一个47kb的文件,相当实用,做前端无刷新页面,快速实现JS与HTML数据交互. knockout目前最新版:knockout ...

  5. Sql 随机更新一条数据返回更新数据的ID编号

    DECLARE @parimaryTable(临时表)  Table(prizecode varchar(50)); update top (1)  数据表 set 字段a='数值' ,字段b=‘数值 ...

  6. pymongo一次更新多条数据

    db.collection.update(query, update, upsert, multi) pymongo使用示例 db.collection.update({}, {'$set' : {' ...

  7. mongoose+koa2 按照_id更新多条数据,删除数组中的字段,然后添加新的字段,$pull和$or结合使用

    await model.photo.update({ _id: { $in: photoIdsParam } }, { $pull: { customerIds: { code: custCode, ...

  8. 十几万条数据的表中,基于帝国cms 。自己亲身体验三种批量更新数据的方法,每一种的速度是什么样的

    需求是 上传Excel 读取里面的数据.根据Excel中某一个字段,与数据表中的一个字段的唯一性.然后把 Excel表中数据和数据库表中数据一次更改.本次测试一次更新31条数据. 本次测试基于帝国cm ...

  9. mysql语句:批量更新多条记录的不同值[转]

    mysql语句:批量更新多条记录的不同值 mysql更新语句很简单,更新一条数据的某个字段,一般这样写: 帮助 1 UPDATE mytable SET myfield = 'value' WHERE ...

随机推荐

  1. lib和dll文件的区别和联系

    什么是lib文件,lib和dll的关系如何 (2008-04-18 19:44:37)    (1)lib是编译时需要的,dll是运行时需要的. 如果要完成源代码的编译,有lib就够了. 如果也使动态 ...

  2. MFC线程钩子和全局钩子[HOOK DLL]

    第一部分:API函数简介 1.       SetWindowsHookEx函数 函数原型 HHOOK SetWindowsHookEx( int idHook,        // hook typ ...

  3. Java 另一道构造器与构造器重载的题目

    题目: 请写出以下程序的输出结果 public class ConstructorTest2 { public static void main(String[] args) { new B(&quo ...

  4. http://www.ibm.com/developerworks/cn/java/j-lo-hotswapcls/

    http://www.ibm.com/developerworks/cn/java/j-lo-hotswapcls/

  5. thinkphp多表关联并且分页

    $db_prefix = C('DB_PREFIX'); $Model = new Model(); $data = $Model->table("{$db_prefix}ordern ...

  6. tinyXml在linux下的使用

    [下载] 一.下载 xml 软件包:tinyxml_2_6_2.zipTinyxml(轻量级 c++)下载地址:http://sourceforge.net/projects/tinyxml/?sou ...

  7. Android:属性scaleType与图片的显示

    ImageView是Android中的基础图片显示控件,该控件有个重要的属性是ScaleType,该属性用以表示显示图片的方式, 共有8种取值 matrix 用矩阵来绘制(从左上角起始的矩阵区域) f ...

  8. Uploadify参数详解

    属性 $('#file_upload').uploadify({    //一属性详解       id: jQuery(this).attr('id'),//绑定的input的ID       la ...

  9. poj2186Popular Cows(强连通分量)

    http://poj.org/problem?id=2186 用tarjan算出强连通分量的个数 将其缩点 连成一棵树  则题目所求即变成求出度为0 的那个节点 在树中是唯一的 即树根 #includ ...

  10. bzoj3996

    把这个式子弄清楚就知道这是最小割了 相当于,选某个点i有收入ai,i,会损失ci, 如果i,j都被选则有额外收入ai,j+aj,i 明显,对每个点i,连(s,i,∑ai,j) (i,t,ci) 对每对 ...