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的插件,用于支持存储库,工作单元模式以及支持分布式事务 ...
随机推荐
- Mysql多实例数据库安装应用
第1章 MySQL多实例数据库企业级应用实践 1.1 MySQL多实例介绍 前文已经讲了为什么选择MySQL数据库,以及MySQL数据库在Linux系统下的多种安装方式,同时以单实例讲解了编译方式安装 ...
- 07 部署fastDFS文件数据库
安装fastDFS前必须准备好两个版本匹配的文件: libfastcommon_V1.0.7.tar.gz:基础库文件 FastDFS_V5.05.tar.gz:文件数据库文件 注:这两个文件版本要匹 ...
- dijkstra算法为什么不能处理带有负边权的图
1 2 3 1 0 8 9 2 10 0 10 3 10 -2 0 先看样例再解释,看邻接矩阵会发现, 如果用dijkstra算1-2的最短路因为贪心思想所以得到的结果是8,但明显可以看到1-3- ...
- 题解 CF712C 【Memory and De-Evolution】
看到题我第一反应就是while循环 但是我竟然想正着推,失败,卡了十几分钟 后来我回来看到第三组测试数据 想到倒推 但是没坚持 于是我又卡了很久 过会我又回来想 AC了... 这个故事告诉我们,要努力 ...
- 【转载】Hibernate关系映射
1. 单向一对一关联映射(one-to-one): 两个对象之间一对的关系,例如:Person(人)-IdCard(身份证) 有两种策略可以实现一对一的关联映射: *主键关联:即让两个对 ...
- Python_面向对象进阶
isinstance和issubclass isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(object): pass obj = Foo() isi ...
- python之路xml模块补充
创建一个子节点一共有三个方式 创建一个子节点2.3
- bzoj 3669: [Noi2014]魔法森林 (LCT & kruskal)
这道题呢, 首先按照关键字a排序,然后不断地加边,用lct维护这个过程 具体实现: 先按照关键字a排序,枚举每一条边,判断两点是否已经联通(kruskal 部分)如果联通,就在两点路径间寻找最大的b, ...
- mp
问题 G: Green Bin 时间限制: 1 Sec 内存限制: 128 MB[提交] [状态] 题目描述 We will call a string obtained by arranging ...
- 【vue store的使用方法】(this.$store.state this.$store.getters this.$store.dispatch this.$store.commit)
vue 页面文件 <template> <div> {{this.$store.state.count}}<br/> {{count}}<br/> {{ ...