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的插件,用于支持存储库,工作单元模式以及支持分布式事务 ...
随机推荐
- Alan Walker MV 合辑01 by defender 歌词
其实是歌词浏览,配套Alan Walker MV 合辑01 by defender You were the shadow to my life Did you feel us Another sta ...
- PyQt5+Eric6开发的一个使用菜单栏、工具栏和状态栏的示例
前言 在做一个数据分析的桌面端程序遇到一些问题,这里简单整理下,分享出来供使用者参考. 1.网上查使用PyQt5工具栏的示例,发现很多只是一个简单的退出功能,如果有几个按钮如何处理?如何区分点击的究竟 ...
- java锁(转)
Java中锁分类 锁的分类 公平锁/非公平锁 可重入锁 独享锁/共享锁 互斥锁/读写锁 乐观锁/悲观锁 分段锁 偏向锁/轻量级锁/重量级锁 自旋锁(java.util.concurrent包下的几乎都 ...
- Python并发学习
#Python并发 多任务 多进程 多线程 线程同步 #多任务处理 多任务处理:使得计算机可以同时处理多个任务 听歌的同时QQ聊天.办公.下载文件 实现方式:多进程.多线程 #程序和进程 程序:是一个 ...
- python面试的100题(18)
函数 52.python常见的列表推导式? 列表推导式书写形式: [表达式 for 变量 in 列表] 或者 [表达式 for 变量 in 列表 if 条件] 参考地址:https://www.cnb ...
- C++-POJ2955-Brackets[DP]
题意就是,找出最长合法子括号序列 容易想到设f[l][r]为l~r的最长合法子括号序列的长度 然后从短的状态往长的状态枚举,不断更新答案就可以了 //#include<bits/stdc++.h ...
- 浅析State-Thread
State-Thread(以下简称st),是一个由C语言编写的小巧.简洁却高效的开源协程库.这个库基于单线程运作.不强制占用用户线程,给予了开发者最大程度的轻量级和较低的侵入性.本篇文章中,网易云信音 ...
- codeforces 1282 E. The Cake Is a Lie (dfs+构造)
链接:https://codeforces.com/contest/1282/problem/E 题意:给的是一张平面图,是一个n边形,每次可以切一刀,切出一个三角形,最终切成n-2个三角形.题目给出 ...
- spring(五):AOP
AOP(Aspect Oriented Programming) 面向切面编程,是一种编程范式,提供从另一个角度来考虑程序结构从而完善面向对象编程(OOP). 在进行OOP开发时,都是基于对组件(比如 ...
- MVC HTML辅助方法
HTML辅助方法(HTML Helper)用来辅助产生HTML,在开发View的时候会面对许多HTML标签,处理这些HTML标签非常繁琐,为了降低View的复杂度,可以使用HTML辅助方法帮助你产生一 ...