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

时间:2022-09-26 09:30:19

原文链接: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&period;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. &lbrack;oracle&sol;java&sol;sql&rsqb;用于上十万批量数据插入Oracle表的Java程序

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

  7. EntityFramework 插件之EntityFramework&period;Extended &lpar;批量处理&rpar;

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

  8. 15&period;更新和删除数据--SQL

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

  9. BulkSqlCopy 批量导入数据(Ef支持)

    Ado.net对批量数据的支持相信大家都已经非常熟悉.再此就不在多说,就当是给自己备个份,没办法,这个方法太好用了. public static void BulkCreate( string tab ...

随机推荐

  1. &period;NET正则表达式基础入门(三)

    括号 正则表达式中的括号能将多个字符或者表达式当做一组,即将他们看成一个整体.这样量词就可以修饰这一组表达式.阅读本章前,建议先下载我于CSDN上传的示例代码,下载无需分数,下载链接. 1.分组 假设 ...

  2. ios - loadView与viewDidload

    从打印结果可以看出,先调用loadView再调用viewDidload 代码: // // ViewController.m // test // // Created by 裴波波 on 16/4/ ...

  3. C&num;中的默认访问修饰符

    1.命名空间下的元素的默认访问修饰符 public : 同一程序集的其他任何代码或引用该程序集的其他程序集都可以访问该类型或成员.internal : 同一程序集中的任何代码都可以访问该类型或成员,但 ...

  4. lintcode&colon;单词切分

    单词切分 给出一个字符串s和一个词典,判断字符串s是否可以被空格切分成一个或多个出现在字典中的单词. 样例 s = "lintcode" dict = ["lint&qu ...

  5. Linear Regression

    大学时候学物理实验的时候接触过线性回归,现在忘记了...还得重新拾起来.学习不扎实耽误了多少时光... sigh Suppose that you time a program as a functi ...

  6. MyEclipse运行到断点也跳过的问题

    如果是B/S开发也就是javaWeb开发的话,Tomcat 的启动模式要设置成Debug模式 还有下面是没运行时断点的样子: 运行的时候,断点会变成对钩,表示执行到它所在代码的时候会停下来:

  7. 草,又学了个新命令,nc传文件。

    nc -l 5222 > aa nc 192.168.0.48 5222 < a http://www.linuxso.com/command/nc.html

  8. v3学院带您一起学习FPGA

    本文为原创,转载请注明! 课程名称:双buffer乒乓操作项目概况:使用FPGA内部ram作为缓冲器,实现对外部数据流的缓存:为了提升数据的传输及处理速度,在此节课中将用到两个ram进行乒乓操作.结构 ...

  9. DirectFB 之 字体显示(2)

    框架 示例代码 /********************************************** * Author: younger.liucn@hotmail.com * File n ...

  10. 利用PCA降维

    参考:<机器学习实战>- Machine Learning in Action 一. 基本思想  PCA(Principal Component Analysis),主成分分析.是目前应用 ...