原文链接: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. 浏览器根对象window之值为数值的属性

    1. number属性 1.1 length length 属性返回在当前窗口中frames的数量(包括IFRAMES). 该属性值与window.frames.length属性值相等. 1.2 in ...

  2. 【es6】Generator 函数

    1. 基本概念 状态机,封装了多个内部状态 2. 应用 返回一个遍历器对象. 3. 代码形式 function* helloWorldGenertor() { yield 'hello'; yield ...

  3. 如何从只会 C++ 语法的水平到达完成项目编写软件的水平?

    原文:https://www.zhihu.com/question/29702729 学习 C++ 有一段时间了,但只是停留在熟悉语法阶段,在看 C++primer,不过感觉这本书比较深奥,不太适合, ...

  4. js API列表

    //  主要是ES的API和一小部分浏览器的API. //  新加入标准的API有可能是浏览器事实上早已实现的. //   ECMAScript目前是每年都会发布新版本(目前已经相对稳定,每年都会又增 ...

  5. C# winform Visual Studio Installer打包教程

    C# winform  Visual Studio Installer打包教程 软件在功能开发实现后,其实并没有真正的完成.对于一个专业的开发者来说,Release软件应该是以安装版本的形式进行发布的 ...

  6. 一、C#简单读写

    using System.IO; static string configFileName = "config.json"; //不存在就直接新建文件夹 public static ...

  7. [翻译] FLAnimatedImage

    FLAnimatedImage FLAnimatedImage is a performant animated GIF engine for iOS: FLAnimatedImage是一个播放gif ...

  8. cmd命令提示符大全(干货)

    cmd是command的缩写.即命令提示符(CMD),是在OS / 2 , Windows CE与Windows NT平台为基础的操作系统(包括Windows 2000和XP中, Vista中,和Se ...

  9. July 31st 2017 Week 31st Monday

    Elegance is the only beauty that never fades. 优雅是唯一不会褪色的美. Even the most beautiful apperace would be ...

  10. 结构类型:Struct

    一.概述: 结构类似于类,但结构为值类型,存储于栈中. 结构不能继承和被继承,但可实现接口. 结构成员访问级别有public,private(默认) ,internal. 1.简单结构 可以将无方法, ...