EF结合SqlBulkCopy实现高效的批量数据插入 |EF插件EntityFramework.Extended实现批量更新和删除
原文链接:http://blog.csdn.net/fanbin168/article/details/51485969
批量插入 (17597条数据批量插入耗时1.7秒)
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Web;
- using System.Web.Mvc;
- namespace MvcApplication1.Controllers
- {
- using MvcApplication1.Models;
- using EntityFramework.Extensions;
- using System.ComponentModel;
- using System.Data;
- using System.Data.SqlClient;
- using System.Diagnostics;
- public class HomeController : Controller
- {
- public ActionResult Index()
- {
- Stopwatch sw = new Stopwatch(); //计时器
- sw.Start();//开始计时
- using (var db = new salesEntities())
- {
- List<location> entitys = db.location.ToList(); //构建集合,到时候会将这个集合数据批量插入到
- if (db.Database.Connection.State != ConnectionState.Open)
- {
- db.Database.Connection.Open(); //打开Connection连接
- }
- //调用BulkInsert方法,将entitys集合数据批量插入到数据库的tolocation表中
- BulkInsert<location>((SqlConnection)db.Database.Connection, "tolocation", entitys);
- if (db.Database.Connection.State != ConnectionState.Closed)
- {
- db.Database.Connection.Close(); //关闭Connection连接
- }
- }
- sw.Stop(); //结束计时
- string aa = sw.Elapsed.ToString();//批量插入了17597条数据。耗时1.7秒
- return View();
- }
- /// <summary>
- /// 批量插入
- /// </summary>
- /// <typeparam name="T">泛型集合的类型</typeparam>
- /// <param name="conn">连接对象</param>
- /// <param name="tableName">将泛型集合插入到本地数据库表的表名</param>
- /// <param name="list">要插入大泛型集合</param>
- public static void BulkInsert<T>(SqlConnection conn, string tableName, IList<T> list)
- {
- using (var bulkCopy = new SqlBulkCopy(conn))
- {
- bulkCopy.BatchSize = list.Count;
- bulkCopy.DestinationTableName = tableName;
- var table = new DataTable();
- var props = TypeDescriptor.GetProperties(typeof(T))
- .Cast<PropertyDescriptor>()
- .Where(propertyInfo => propertyInfo.PropertyType.Namespace.Equals("System"))
- .ToArray();
- foreach (var propertyInfo in props)
- {
- bulkCopy.ColumnMappings.Add(propertyInfo.Name, propertyInfo.Name);
- table.Columns.Add(propertyInfo.Name, Nullable.GetUnderlyingType(propertyInfo.PropertyType) ?? propertyInfo.PropertyType);
- }
- var values = new object[props.Length];
- foreach (var item in list)
- {
- for (var i = 0; i < values.Length; i++)
- {
- values[i] = props[i].GetValue(item);
- }
- table.Rows.Add(values);
- }
- bulkCopy.WriteToServer(table);
- }
- }
- }
- }
使用EF扩展EntityFramework.Extended 对数据进行批量更新,和批量删除
批量更新(17597条数据,批量更新耗时1.69秒)
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Web;
- using System.Web.Mvc;
- namespace MvcApplication1.Controllers
- {
- using MvcApplication1.Models;
- using EntityFramework.Extensions; //使用EF的EntityFramework.Extended插件需要引入此名称空间
- using System.Diagnostics;
- public class HomeController : Controller
- {
- public ActionResult Index()
- {
- salesEntities db = new salesEntities();
- Stopwatch sw = new Stopwatch(); //计时器
- sw.Start();
- //调用插件的Update方法进行批量更新(不需要我们手动的db.SaveChanges()了)
- //db.location.Update(r => new location { version = 123 });//批量将location表里version字段数据更新为123
- db.tolocation.Where(r => r.locId < 100).Update(c => new tolocation { version = 236 }); //也可以带条件批量修改
- sw.Stop();
- string aa = sw.Elapsed.ToString();//批量更新了17597条数据。耗时1.69秒
- return View();
- }
- }
- }
批量删除(17597条数据,批量删除耗时1.76秒)
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Web;
- using System.Web.Mvc;
- namespace MvcApplication1.Controllers
- {
- using MvcApplication1.Models;
- using EntityFramework.Extensions; //使用EF的EntityFramework.Extended插件需要引入此名称空间
- using System.Diagnostics;
- public class HomeController : Controller
- {
- public ActionResult Index()
- {
- salesEntities db = new salesEntities();
- Stopwatch sw = new Stopwatch(); //计时器
- sw.Start();
- //调用插件的Delete方法进行批量删除(不需要我们手动的db.SaveChanges()了)
- //db.location.Delete(r => r.locId < 100000);
- db.location.Where(r => r.locId < 10000).Delete(); //当然我也可以这样写
- sw.Stop();
- string aa = sw.Elapsed.ToString();//批量删除了17597条数据。耗时1.76秒
- return View();
- }
- }
- }
EF结合SqlBulkCopy实现高效的批量数据插入 |EF插件EntityFramework.Extended实现批量更新和删除的更多相关文章
- yii批量数据插入
yii框架批量插入数据有两种方法,第一种是循环多次插入和一次批量插入,第一种方法要注意插入数据中间有一次数据插入失败要注意回滚事务 循环插入数据 第一种方法 $model = new User(); ...
- MyBatis Plus 批量数据插入功能,yyds!
最近 Review 小伙伴代码的时候,发现了一个小小的问题,小伙伴竟然在 for 循环中进行了 insert (插入)数据库的操作,这就会导致每次循环时都会进行连接.插入.断开连接的操作,从而导致一定 ...
- ef和mysql使用(二)--让mysql支持EntityFramework.Extended实现批量更新和删除
我们都知道Entity Framework 中不能同时更新多条记录,但是一个老外写的扩展库可以实现此功能EntityFramework.Extended,但是如何是mysql数据库要怎么实现呢 首先实 ...
- 使用SqlBulkCopy进行批量数据插入
Dim dt As DataTable = New DataTable() dt.Columns.Add("DtCostProductRuleGUID", GetType(Guid ...
- 原创 SqlParameter 事务 批量数据插入
不错,很好,以后防注入批量事务提交虽然麻烦点研究了几个小时,但不会是问题了 SqlCommand cmd; HelpSqlServer helps = new HelpSqlServer(); //定 ...
- [oracle/java/sql]用于上十万批量数据插入Oracle表的Java程序
程序下载:https://files.cnblogs.com/files/xiandedanteng/LeftInnerNotExist20191222.rar 原理:Oracle的Insert al ...
- KingbaseES批量数据加载的实践技巧
有时,KingbaseES数据库需要在单个或最少的步骤中导入大量数据,这通常称为批量数据导入.其中数据源通常是一个或多个大文件,这个过程有时可能非常慢. 造成性能不佳的原因有很多:索引.触发器.外键. ...
- EntityFramework 插件之EntityFramework.Extended (批量处理)
接手了一个用EF来做的项目,由于项目中使用的原生处理,导致很多update都是采用先select 后 update的方式来实现,同时无法批量执行逻辑如:根据订单类型统一更新状态等.所以在经过了N多查找 ...
- 15.更新和删除数据--SQL
一.更新数据 更新(修改)表中的数据,可以使用UPDA TE语句.有两种使用UPDA TE的方式: 更新表中的特定行: 更新表中的所有行. 警告:不要省略WHERE子句 在使用UPDA TE时一定要细 ...
随机推荐
- Git简介、安装与配置
老规矩QAQ,先来简单介绍一下Git: Git是一个分布式版本控制系统,可以理解为是一个用于管理代码,控制版本,方便多人合作开发的一款工具. Git:分布式版本控制系统. SVN.CVS:集中式版本控 ...
- React 入门实例教程[阮一峰的网络日志] (分享)
作者: 阮一峰 https://github.com/ruanyf/react-demos 转自:http://www.ruanyifeng.com/blog/2015/03/react.html 对 ...
- 同步(Synchronous)和异步(Asynchronous)的概念
web项目中的同步与异步 在我们平时的web项目开发中会经常听到ajax请求这样一个称呼,在web项目中可以通过js或者jquery发送同步请求又或者异步请求,同步请求呢往往代表着你必须等待这次请求结 ...
- 闭包&执行环境和作用域
闭包 执行环境和作用域参考:<javascript高级程序设计(第3版)>4.2节
- springboot监控
springboot版本 <parent> <groupId>org.springframework.boot</groupId> <artifactId&g ...
- oracle的乐观锁和悲观锁
一.问题引出 1. 假设当当网上用户下单买了本书,这时数据库中有条订单号为001的订单,其中有个status字段是’有效’,表示该订单是有效的: 2. 后台管理人员查询到这条001的订单,并且看到状态 ...
- chchc
---恢复内容开始--- 51CTO博客-原创IT文章分享平台 Logo 首页 文章 专家 专家博客 博客之星 推荐博客 我的博客 网站导航 学院 博客 下载 家园 论坛 CTO训练营 WOT 51C ...
- 猴子选大王【PHP】
目录 猴子选大王 指针解决 数组压栈 猴子选大王 一群猴子排成一圈,按1,2,...,n依次编号.然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去...,如此不 ...
- ZT Android的引用计数(强弱指针)技术及一些问题
Android的引用计数(强弱指针)技术及一些问题 分类: Android 2013-06-07 18:25 844人阅读 评论(4) 收藏 举报 目录(?)[+] Android C++框架层的引用 ...
- 秒杀场景下MySQL的低效(转)
秒杀场景下MySQL的低效 2016-01-14 17:12 178人阅读 评论(0) 收藏 举报 最近业务试水电商,接了一个秒杀的活.之前经常看到淘宝的同行们讨论秒杀,讨论电商,这次终于轮到我们自己 ...