原文链接:http://blog.csdn.net/fanbin168/article/details/51485969

 

批量插入 (17597条数据批量插入耗时1.7秒)

  1.  
    using System;
  2.  
    using System.Collections.Generic;
  3.  
    using System.Linq;
  4.  
    using System.Web;
  5.  
    using System.Web.Mvc;
  6.  
     
  7.  
    namespace MvcApplication1.Controllers
  8.  
    {
  9.  
    using MvcApplication1.Models;
  10.  
    using EntityFramework.Extensions;
  11.  
    using System.ComponentModel;
  12.  
    using System.Data;
  13.  
    using System.Data.SqlClient;
  14.  
    using System.Diagnostics;
  15.  
    public class HomeController : Controller
  16.  
    {
  17.  
    public ActionResult Index()
  18.  
    {
  19.  
    Stopwatch sw = new Stopwatch(); //计时器
  20.  
    sw.Start();//开始计时
  21.  
     
  22.  
    using (var db = new salesEntities())
  23.  
    {
  24.  
     
  25.  
    List<location> entitys = db.location.ToList(); //构建集合,到时候会将这个集合数据批量插入到
  26.  
     
  27.  
    if (db.Database.Connection.State != ConnectionState.Open)
  28.  
    {
  29.  
    db.Database.Connection.Open(); //打开Connection连接
  30.  
    }
  31.  
     
  32.  
    //调用BulkInsert方法,将entitys集合数据批量插入到数据库的tolocation表中
  33.  
    BulkInsert<location>((SqlConnection)db.Database.Connection, "tolocation", entitys);
  34.  
     
  35.  
    if (db.Database.Connection.State != ConnectionState.Closed)
  36.  
    {
  37.  
    db.Database.Connection.Close(); //关闭Connection连接
  38.  
    }
  39.  
    }
  40.  
     
  41.  
    sw.Stop(); //结束计时
  42.  
    string aa = sw.Elapsed.ToString();//批量插入了17597条数据。耗时1.7秒
  43.  
    return View();
  44.  
    }
  45.  
     
  46.  
     
  47.  
    /// <summary>
  48.  
    /// 批量插入
  49.  
    /// </summary>
  50.  
    /// <typeparam name="T">泛型集合的类型</typeparam>
  51.  
    /// <param name="conn">连接对象</param>
  52.  
    /// <param name="tableName">将泛型集合插入到本地数据库表的表名</param>
  53.  
    /// <param name="list">要插入大泛型集合</param>
  54.  
    public static void BulkInsert<T>(SqlConnection conn, string tableName, IList<T> list)
  55.  
    {
  56.  
    using (var bulkCopy = new SqlBulkCopy(conn))
  57.  
    {
  58.  
    bulkCopy.BatchSize = list.Count;
  59.  
    bulkCopy.DestinationTableName = tableName;
  60.  
     
  61.  
    var table = new DataTable();
  62.  
    var props = TypeDescriptor.GetProperties(typeof(T))
  63.  
     
  64.  
    .Cast<PropertyDescriptor>()
  65.  
    .Where(propertyInfo => propertyInfo.PropertyType.Namespace.Equals("System"))
  66.  
    .ToArray();
  67.  
     
  68.  
    foreach (var propertyInfo in props)
  69.  
    {
  70.  
    bulkCopy.ColumnMappings.Add(propertyInfo.Name, propertyInfo.Name);
  71.  
    table.Columns.Add(propertyInfo.Name, Nullable.GetUnderlyingType(propertyInfo.PropertyType) ?? propertyInfo.PropertyType);
  72.  
    }
  73.  
     
  74.  
    var values = new object[props.Length];
  75.  
    foreach (var item in list)
  76.  
    {
  77.  
    for (var i = 0; i < values.Length; i++)
  78.  
    {
  79.  
    values[i] = props[i].GetValue(item);
  80.  
    }
  81.  
     
  82.  
    table.Rows.Add(values);
  83.  
    }
  84.  
     
  85.  
    bulkCopy.WriteToServer(table);
  86.  
    }
  87.  
    }
  88.  
     
  89.  
    }
  90.  
    }

使用EF扩展EntityFramework.Extended 对数据进行批量更新,和批量删除

首先去nuget上下载EntityFramework.Extended插件(搜索:EntityFramework.Extended) 安装后,在项目中引入using EntityFramework.Extensions; 名称空间
 

批量更新(17597条数据,批量更新耗时1.69秒)

  1.  
    using System;
  2.  
    using System.Collections.Generic;
  3.  
    using System.Linq;
  4.  
    using System.Web;
  5.  
    using System.Web.Mvc;
  6.  
     
  7.  
    namespace MvcApplication1.Controllers
  8.  
    {
  9.  
    using MvcApplication1.Models;
  10.  
    using EntityFramework.Extensions; //使用EF的EntityFramework.Extended插件需要引入此名称空间
  11.  
    using System.Diagnostics;
  12.  
     
  13.  
    public class HomeController : Controller
  14.  
    {
  15.  
    public ActionResult Index()
  16.  
    {
  17.  
    salesEntities db = new salesEntities();
  18.  
     
  19.  
    Stopwatch sw = new Stopwatch(); //计时器
  20.  
    sw.Start();
  21.  
     
  22.  
    //调用插件的Update方法进行批量更新(不需要我们手动的db.SaveChanges()了)
  23.  
    //db.location.Update(r => new location { version = 123 });//批量将location表里version字段数据更新为123
  24.  
     
  25.  
    db.tolocation.Where(r => r.locId < 100).Update(c => new tolocation { version = 236 }); //也可以带条件批量修改
  26.  
     
  27.  
     
  28.  
    sw.Stop();
  29.  
    string aa = sw.Elapsed.ToString();//批量更新了17597条数据。耗时1.69秒
  30.  
    return View();
  31.  
    }
  32.  
    }
  33.  
    }

批量删除(17597条数据,批量删除耗时1.76秒)

    1.  
      using System;
    2.  
      using System.Collections.Generic;
    3.  
      using System.Linq;
    4.  
      using System.Web;
    5.  
      using System.Web.Mvc;
    6.  
       
    7.  
      namespace MvcApplication1.Controllers
    8.  
      {
    9.  
      using MvcApplication1.Models;
    10.  
      using EntityFramework.Extensions; //使用EF的EntityFramework.Extended插件需要引入此名称空间
    11.  
      using System.Diagnostics;
    12.  
       
    13.  
      public class HomeController : Controller
    14.  
      {
    15.  
      public ActionResult Index()
    16.  
      {
    17.  
      salesEntities db = new salesEntities();
    18.  
       
    19.  
      Stopwatch sw = new Stopwatch(); //计时器
    20.  
      sw.Start();
    21.  
       
    22.  
      //调用插件的Delete方法进行批量删除(不需要我们手动的db.SaveChanges()了)
    23.  
      //db.location.Delete(r => r.locId < 100000);
    24.  
       
    25.  
      db.location.Where(r => r.locId < 10000).Delete(); //当然我也可以这样写
    26.  
       
    27.  
       
    28.  
      sw.Stop();
    29.  
      string aa = sw.Elapsed.ToString();//批量删除了17597条数据。耗时1.76秒
    30.  
      return View();
    31.  
      }
    32.  
      }
    33.  
      }

EF结合SqlBulkCopy实现高效的批量数据插入 |EF插件EntityFramework.Extended实现批量更新和删除的更多相关文章

  1. yii批量数据插入

    yii框架批量插入数据有两种方法,第一种是循环多次插入和一次批量插入,第一种方法要注意插入数据中间有一次数据插入失败要注意回滚事务 循环插入数据 第一种方法 $model = new User(); ...

  2. MyBatis Plus 批量数据插入功能,yyds!

    最近 Review 小伙伴代码的时候,发现了一个小小的问题,小伙伴竟然在 for 循环中进行了 insert (插入)数据库的操作,这就会导致每次循环时都会进行连接.插入.断开连接的操作,从而导致一定 ...

  3. ef和mysql使用(二)--让mysql支持EntityFramework.Extended实现批量更新和删除

    我们都知道Entity Framework 中不能同时更新多条记录,但是一个老外写的扩展库可以实现此功能EntityFramework.Extended,但是如何是mysql数据库要怎么实现呢 首先实 ...

  4. 使用SqlBulkCopy进行批量数据插入

    Dim dt As DataTable = New DataTable() dt.Columns.Add("DtCostProductRuleGUID", GetType(Guid ...

  5. 原创 SqlParameter 事务 批量数据插入

    不错,很好,以后防注入批量事务提交虽然麻烦点研究了几个小时,但不会是问题了 SqlCommand cmd; HelpSqlServer helps = new HelpSqlServer(); //定 ...

  6. [oracle/java/sql]用于上十万批量数据插入Oracle表的Java程序

    程序下载:https://files.cnblogs.com/files/xiandedanteng/LeftInnerNotExist20191222.rar 原理:Oracle的Insert al ...

  7. KingbaseES批量数据加载的实践技巧

    有时,KingbaseES数据库需要在单个或最少的步骤中导入大量数据,这通常称为批量数据导入.其中数据源通常是一个或多个大文件,这个过程有时可能非常慢. 造成性能不佳的原因有很多:索引.触发器.外键. ...

  8. EntityFramework 插件之EntityFramework.Extended (批量处理)

    接手了一个用EF来做的项目,由于项目中使用的原生处理,导致很多update都是采用先select 后 update的方式来实现,同时无法批量执行逻辑如:根据订单类型统一更新状态等.所以在经过了N多查找 ...

  9. 15.更新和删除数据--SQL

    一.更新数据 更新(修改)表中的数据,可以使用UPDA TE语句.有两种使用UPDA TE的方式: 更新表中的特定行: 更新表中的所有行. 警告:不要省略WHERE子句 在使用UPDA TE时一定要细 ...

随机推荐

  1. ubuntu 14.04/14.10 iptables 防火墙设置

    1. 一键批处理设置      [plain] view plaincopyprint? #!/bin/bash PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/loc ...

  2. Linux下vim(文本编译器)的使用

    vim (文本编译器): Vim是从 vi 发展出来的一个文本编辑器. vim的一些命令操作: 插入命令: a 在光标所在字符后插入 A 在光标所在行尾插入 i 在光标所在字符前插入 I 在光标所在行 ...

  3. Windows下本机简易监控系统搭建(Telegraf+Influxdb+Grafana)

    一.文件准备 1.1 文件名称 telegraf-1.2.1_windows_amd64.zip influxdb-1.2.2_windows_amd64.zip grafana-4.2.0.wind ...

  4. Spring面试 IOC和AOP的理解

    spring 的优点?1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦 2.可以使用容易提供的众多服务,如事务管理,消息服务等 3.容器提供单例模式支持 4.容器提供了AOP技术,利用它很容易实 ...

  5. Netty高性能web框架

    框架背景: 前期为公司项目做全链路压测,发现公司跑到tomcat上的服务,即使是最简单的方法QPS也就到3000左右,后期查询发现可能和tomcat的业务逻辑有关. 因为以前在项目开发中用netty做 ...

  6. CentOS随笔 - 6.CentOS7安装Git服务器

    前言 转帖请注明出处: http://www.cnblogs.com/Troy-Lv5/ 版本管理当然是选择git..反正我是被svn坑怕了... 这次安装的是git 2.18.0 点击下载 准备安装 ...

  7. 使用iCarousel的旋转木马效果请求图片

    使用iCarousel的旋转木马效果请求图片 https://github.com/nicklockwood/iCarousel 先看看效果: 源码如下: // // RootViewControll ...

  8. python面向对象编程(2)—— 实例属性,类属性,类方法,静态方法

    1  实例属性和类属性 类和实例都是名字空间,类是类属性的名字空间,实例则是实例属性的名字空间. 类属性可通过类或实例来访问.只有通过类名访问时,才能修改类属性的值. 例外的一种情况是,当类属性是一个 ...

  9. Python实例---简单购物车Demo

    简单购物车Demo # version: python3.2.5 # author: 'FTL1012' # time: 2017/12/7 09:16 product_list = ( ['Java ...

  10. 自动化测试全套流程(一)-搭建Jenkins环境

    前提 既然要做自动化测试,那我们就做得彻底一些,将整套系统部署在Linux服务器上,在搭建Jenkins环境之前,我已经通过VirtualBox安装了一个CentOS的服务器,搭建Jenkins是基于 ...