EFCore.BulkExtensions Demo
最近做了一个项目,当用EF传统的方法执行时,花时4小时左右,修改后,时间大大减少到10分钟,下面是DEMO实例
实体代码:
public class UserInfoEntity
{
[Key]
public Guid Id { get; set; }
public string Name { get; set; }
public string Mobile { get; set; }
public string LoginName { get; set; }
public string LoginPassword { get; set; }
public string Role { get; set; }
}
仓储代码:
using EFCore.BulkExtensions;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions; namespace UserInfo
{
public class UserInfoRepository : IDisposable
{
DbContext context;
public UserInfoRepository(DbContext context)
{
this.context = context;
}
public void Dispose()
{
this.context.Dispose();
} #region 常规EF的方法
public UserInfoEntity GetUserInfo(string loginName, string loginPassword)
{
var currentContext = this.context as UserInfoContext;
return currentContext.Set<UserInfoEntity>()
.FirstOrDefault(o => o.LoginName.Equals(loginName) && o.LoginPassword.Equals(loginPassword));
}
public UserInfoEntity GetUserInfo(Guid id)
{
var currentContext = this.context as UserInfoContext;
return currentContext.Set<UserInfoEntity>().FirstOrDefault(o => o.Id == id);
} public void UpdateUserInfo(UserInfoEntity userInfoEntity)
{
var currentContext = this.context as UserInfoContext;
currentContext.Entry<UserInfoEntity>(userInfoEntity).State = EntityState.Modified;
}
#endregion #region BulkExtensions应用
/// <summary>
/// 插入单个数据
/// </summary>
/// <param name="bulkInsertTest"></param>
public void AddBulkInsertTest(UserInfoEntity bulkInsertTest)
{
var currentContext = this.context as UserInfoContext;
currentContext.UserInfoEntity.Add(bulkInsertTest);
}
/// <summary>
/// 批量插入数据
/// </summary>
/// <param name="bulkInsertTests"></param>
public void BatchAddBulkInsertTest(List<UserInfoEntity> bulkInsertTests)
{
var currentContext = this.context as UserInfoContext;
currentContext.BulkInsert(bulkInsertTests);
}
/// <summary>
/// 批量更新数据(更新所有字段)
/// </summary>
/// <param name="conditionExpression"></param>
/// <param name="updateExpression"></param>
public void BatchUpdateBulkInsertTest(Expression<Func<UserInfoEntity, bool>> conditionExpression, Expression<Func<UserInfoEntity, UserInfoEntity>> updateExpression)
{
var currentContext = this.context as UserInfoContext; currentContext.UserInfoEntity.Where(conditionExpression).BatchUpdate(updateExpression);
}
/// <summary>
/// 批量更新数据(更新指定字段)
/// </summary>
/// <param name="conditionExpression"></param>
/// <param name="updateValue"></param>
/// <param name="updateColumns"></param>
public void BatchUpdateBulkInsertTest(Expression<Func<UserInfoEntity, bool>> conditionExpression, UserInfoEntity updateValue, List<string> updateColumns = null)
{
var currentContext = this.context as UserInfoContext;
currentContext.UserInfoEntity.Where(conditionExpression).BatchUpdate(updateValue, updateColumns);
}
/// <summary>
/// 删除单个数据
/// </summary>
/// <param name="bulkInsertTest"></param>
public void DeleteBulkInsertTest(UserInfoEntity bulkInsertTest)
{
var currentContext = this.context as UserInfoContext;
currentContext.UserInfoEntity.Remove(bulkInsertTest);
}
/// <summary>
/// 批量删除
/// </summary>
/// <param name="conditionExpression"></param>
public void BatchDeleteBulkInsertTest(Expression<Func<UserInfoEntity, bool>> conditionExpression)
{
var currentContext = this.context as UserInfoContext;
currentContext.UserInfoEntity.Where(conditionExpression).BatchDelete();
}
#endregion
}
}
用例代码:
using System;
using System.Collections.Generic;
using System.Linq;
using UserInfo;
using Util;
using UserInfoDTOInDTO = Business.AppSrv.DTOS.InDTOS.UserInfoDTO; namespace Business.AppSrv.UseCases
{
public class UserInfoUseCase : BaseAppSrv, IDisposable
{
private UserInfoContext _UserInfoContext;
private UserInfoRepository _UserInfoRepository; public UserInfoUseCase()
{
this._UserInfoContext = new UserInfoContext();
this._UserInfoRepository = new UserInfoRepository(this._UserInfoContext);
} public void Dispose()
{
this._UserInfoRepository.Dispose();
} public void UpdateUserLoginPassword(Guid userID, UserInfoDTOInDTO.UserLoginPasswordUpdate userLoginPasswordUpdate)
{
if (userLoginPasswordUpdate == null)
{
throw new Exception("修改密码参数错误");
} if (string.IsNullOrEmpty(userLoginPasswordUpdate.LoginPasswordOld))
{
throw new Exception("旧密码不能为空");
}
if (string.IsNullOrEmpty(userLoginPasswordUpdate.LoginPasswordNew))
{
throw new Exception("新密码不能为空");
} UserInfoEntity userInfoEntity = this._UserInfoRepository.GetUserInfo(userID);
if (userInfoEntity == null)
{
throw new Exception("用户不存在");
} if (!userLoginPasswordUpdate.LoginPasswordOld.Equals(userInfoEntity.LoginPassword))
{
throw new Exception("旧密码错误");
}
userInfoEntity.LoginPassword = userLoginPasswordUpdate.LoginPasswordNew;
this._UserInfoRepository.UpdateUserInfo(userInfoEntity);
this._UserInfoContext.SaveChanges();
} public double AddBulkInsertTest(int count)
{
double result = ; System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch();
watch.Start(); for (int i = ; i < count; i++)
{
var userInfoEntity = new UserInfoEntity()
{
Id = Guid.NewGuid(),
LoginName = $"登录名{i.ToString("")}",
LoginPassword = $"登录密码{i.ToString("")}",
Name = $"姓名{i.ToString("")}",
Mobile = $"手机号{i.ToString("")}",
Role = $"角色{i.ToString("")}"
};
this._UserInfoRepository.AddBulkInsertTest(userInfoEntity);
} this._UserInfoContext.SaveChanges(); watch.Stop();
result = watch.Elapsed.TotalSeconds; return result;
} public double BatchAddBulkInsertTest(int count)
{
double result = ; System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch();
watch.Start(); var bulkInsertTests = new List<UserInfoEntity>();
for (int i = ; i < count; i++)
{
var userInfoEntity = new UserInfoEntity()
{
Id = Guid.NewGuid(),
LoginName = $"登录名{i.ToString("")}",
LoginPassword = $"登录密码{i.ToString("")}",
Name = $"姓名{i.ToString("")}",
Mobile = $"手机号{i.ToString("")}",
Role = $"角色{i.ToString("")}"
};
bulkInsertTests.Add(userInfoEntity);
} this._UserInfoRepository.BatchAddBulkInsertTest(bulkInsertTests); watch.Stop();
result = watch.Elapsed.TotalSeconds; return result;
} public double UpdateBulkInsertTest()
{
double result = ; System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch();
watch.Start(); var list = this._UserInfoContext.UserInfoEntity.Where(o => true).ToList();
foreach (var item in list)
{
item.Name = DateTime.Now.ToString("yyyyMMddHHmmssfff");
}
this._UserInfoContext.SaveChanges(); watch.Stop();
result = watch.Elapsed.TotalSeconds; return result;
} public double BatchUpdateBulkInsertTest0()
{
double result = ; System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch();
watch.Start(); this._UserInfoRepository.BatchUpdateBulkInsertTest(o => true, o => new UserInfoEntity()
{
Id = o.Id,
Name = DateTime.Now.ToString("yyyyMMddHHmmssfff"),
LoginName = o.LoginName,
LoginPassword = o.LoginPassword,
Mobile = o.Mobile,
Role = o.Role
}); watch.Stop();
result = watch.Elapsed.TotalSeconds; return result;
} public double BatchUpdateBulkInsertTest1()
{
double result = ; System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch();
watch.Start(); this._UserInfoRepository.BatchUpdateBulkInsertTest(o => true, new UserInfoEntity()
{
Name = DateTime.Now.ToString("yyyyMMddHHmmssfff"),
Mobile = ""
}, new string[] { "Name" }.ToList()); watch.Stop();
result = watch.Elapsed.TotalSeconds; return result;
} public double DeleteBulkInsertTest()
{
double result = ; System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch();
watch.Start(); var list = this._UserInfoContext.UserInfoEntity.Where(o => true).ToList();
foreach (var item in list)
{
this._UserInfoRepository.DeleteBulkInsertTest(item);
}
this._UserInfoContext.SaveChanges(); watch.Stop();
result = watch.Elapsed.TotalSeconds; return result;
} public double BatchDeleteBulkInsertTest()
{
double result = ; System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch();
watch.Start(); this._UserInfoRepository.BatchDeleteBulkInsertTest(o => true); watch.Stop();
result = watch.Elapsed.TotalSeconds; return result;
}
}
}
EFCore.BulkExtensions Demo的更多相关文章
- ASP.NET Core 2.2 迁移至 3.0 备忘录
将 ASP.NET Core 2.2 迁移至 ASP.NET Core 3.0 需要注意的地方记录在这篇随笔中. TargetFramework 改为 netcoreapp3.0 <Target ...
- EF Core扩展工具记录
Microsoft.EntityFrameworkCore.AutoHistory Microsoft.EntityFrameworkCore 的一个插件,支持自动记录数据更改历史记录. GitHub ...
- ABP 框架集成EF批量增加、删除、修改只针对使用mmsql的
AppService 层使用nuget 添加 EFCore.BulkExtensions 引用 using Abp.Application.Services.Dto; using Abp.Domain ...
- 一系列令人敬畏的.NET核心库,工具,框架和软件
内容 一般 框架,库和工具 API 应用框架 应用模板 身份验证和授权 Blockchain 博特 构建自动化 捆绑和缩小 高速缓存 CMS 代码分析和指标 压缩 编译器,管道工和语言 加密 数据库 ...
- ASP.NET Core 2.2 项目升级至 3.0 备忘录
将 ASP.NET Core 2.2 迁移至 ASP.NET Core 3.0 需要注意的地方记录在这篇随笔中. TargetFramework 改为 netcoreapp3.0 <Target ...
- Github上优秀的.NET Core项目
Github上优秀的.NET Core开源项目的集合.内容包括:库.工具.框架.模板引擎.身份认证.数据库.ORM框架.图片处理.文本处理.机器学习.日志.代码分析.教程等. Github地址:htt ...
- 【转载】Github上优秀的.NET Core项目
Github上优秀的.NET Core项目 Github上优秀的.NET Core开源项目的集合.内容包括:库.工具.框架.模板引擎.身份认证.数据库.ORM框架.图片处理.文本处理.机器学习.日志. ...
- 单表千万行数据库 LIKE 搜索优化手记
我们经常在数据库中使用 LIKE 操作符来完成对数据的模糊搜索,LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式. 如果需要查找客户表中所有姓氏是“张”的数据,可以使用下面的 SQL 语句 ...
- EF Core扩展工具记录 批量操作 记录修改删除历史 动态linq
Microsoft.EntityFrameworkCore.UnitOfWork Microsoft.EntityFrameworkCore的插件,用于支持存储库,工作单元模式以及支持分布式事务 ...
随机推荐
- (转)HashMap和HashTable源码
转自: http://www.cnblogs.com/ITtangtang/p/3948406.html http://frankfan915.iteye.com/blog/1152091 一.Has ...
- 修改json数据中key(键值)
//方法一:修改JSONObject的键 public static JSONObject changeJsonObj(JSONObject jsonObj,Map<String, String ...
- mysql行级锁 select for update
mysql行级锁 select for update 1.属于行级锁 2.where条件后需要写出明确的索引条件(如果有多个条件,可以建立联合索引) 3.如果其所在的事务提交或者回滚后,或者更新该条数 ...
- HTTP状态码详解【转】
HTTP状态码,我都是现查现用. 我以前记得几个常用的状态码,比如200,302,304,404, 503. 一般来说我也只需要了解这些常用的状态码就可以了. 如果是做AJAX,REST,网络爬虫, ...
- 第四篇,JavaScript面试题汇总
JavaScript是一种属于网络的脚本语言,已经被广泛用于web实用开发,常用来为网页添加各种各样的动态功能,为用户提供更流畅美观的浏览效果.通常JavaScript脚本是通过嵌入在HTML中来实现 ...
- python之路面向对象2
一.利用反射查看面向对象成员的归属 二.利用反射导入模块.查找类.创建对象.查找对象中的字段 三.静态字段 静态字段存在类中,把对象每个都有的存在类中就行了,只存一份 四.静态方法 静态方法中没有se ...
- Ninject 2.x细说---2.绑定和作用域
Ninject 2.x细说---2.绑定和作用域 转载weixin_33725272 最后发布于2011-11-06 00:03:00 阅读数 9 收藏 Ninject中提供多种接口和实现类的绑 ...
- dfs题型一
代码: #include <iostream> #include <algorithm> #include <vector> using namespace std ...
- Ad Hoc类问题
__________________________________ Ad Hoc类问题的方法:(1)机理分析法.分析题目描述,推出算法. (2)统计分析法.追寻最终的数学模型. Problem 1: ...
- python接口自动化测试 - requests库的post请求进行文件上传
前言 如果需要发送文件到服务器,比如上传图片.视频等,就需要发送二进制数据. 一般上传文件使用的都是 Content-Type: multipart/form-data; 数据类型,可以发送文件,也可 ...