此文主要用做记录用:

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

注:转换程序用了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. CF 136A Presents

    http://codeforces.com/problemset/problem/136/A 题意 :就是输入很多数字,第 i 个数字 pi 代表着第 i 个人的礼物给了第 pi 个人,而让你输出的数 ...

  2. Java在Windows的环境配置

    JDK环境变量配置的步骤如下: 1.我的电脑-->属性-->高级-->环境变量. 2.配置用户变量: 系统变量 a.新建 JAVA_HOME C:\Program Files\Jav ...

  3. Android中如何取消调转界面后EditText默认获取聚焦问题

    最近在做一个项目,当我点击跳转至一个带有EditText的界面后,模拟器中的软键盘会自动弹出,严重影响了用户体验.在网上找了资料,现总结如下. 我们知道,EditText有一个 android:foc ...

  4. C++不同进制整数

    在C++的整数常量中,整数分为十进制整数.八进制整数和十六进制整数. 那给出一个整型常量怎样区分是何种进制呢?/给出一个整型常量,如100,默认是十进制数,如果在该数前加0,如0100,则此数表示为八 ...

  5. ENVI Services Engine5.1 应用开发入门教程

    原文地址: ENVI Services Engine5.1 应用开发入门教程_ENVI-IDL中国_新浪博客 http://blog.sina.com.cn/s/blog_764b1e9d0102uy ...

  6. P55、面试题6:重建二叉树

    题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字,例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2, ...

  7. uva 993 Product of digits (贪心 + 分解因子)

      Product of digits  For a given non-negative integer number N , find the minimal natural Q such tha ...

  8. Where is Vasya?

    Where is Vasya? Vasya stands in line with number of people p (including Vasya), but he doesn't know ...

  9. Android开发之极光推送基本步骤

    [转]:http://wyong.blog.51cto.com/1115465/1402842 两天在研究推送的问题,后来确定了用极光推送,本人将整个过程整理一下: 1.到极光官网注册账号:https ...

  10. Java [leetcode 14] Longest Common Prefix

    小二好久没有更新博客了,真是罪过,最近在看linux的东西导致进度耽搁了,所以今晚睡觉前怒刷一题! 问题描述: Write a function to find the longest common ...