zoukankan      html  css  js  c++  java
  • 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 = 0;
    
                System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch();
                watch.Start();
    
                for (int i = 0; i < count; i++)
                {
                    var userInfoEntity = new UserInfoEntity()
                    {
                        Id = Guid.NewGuid(),
                        LoginName = $"登录名{i.ToString("00000")}",
                        LoginPassword = $"登录密码{i.ToString("00000")}",
                        Name = $"姓名{i.ToString("00000")}",
                        Mobile = $"手机号{i.ToString("00000")}",
                        Role = $"角色{i.ToString("00000")}"
                    };
                    this._UserInfoRepository.AddBulkInsertTest(userInfoEntity);
                }
    
                this._UserInfoContext.SaveChanges();
    
                watch.Stop();
                result = watch.Elapsed.TotalSeconds;
    
                return result;
            }
    
            public double BatchAddBulkInsertTest(int count)
            {
                double result = 0;
    
                System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch();
                watch.Start();
    
                var bulkInsertTests = new List<UserInfoEntity>();
                for (int i = 0; i < count; i++)
                {
                    var userInfoEntity = new UserInfoEntity()
                    {
                        Id = Guid.NewGuid(),
                        LoginName = $"登录名{i.ToString("00000")}",
                        LoginPassword = $"登录密码{i.ToString("00000")}",
                        Name = $"姓名{i.ToString("00000")}",
                        Mobile = $"手机号{i.ToString("00000")}",
                        Role = $"角色{i.ToString("00000")}"
                    };
                    bulkInsertTests.Add(userInfoEntity);
                }
    
                this._UserInfoRepository.BatchAddBulkInsertTest(bulkInsertTests);
    
                watch.Stop();
                result = watch.Elapsed.TotalSeconds;
    
                return result;
            }
    
            public double UpdateBulkInsertTest()
            {
                double result = 0;
    
                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 = 0;
    
                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 = 0;
    
                System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch();
                watch.Start();
    
                this._UserInfoRepository.BatchUpdateBulkInsertTest(o => true, new UserInfoEntity()
                {
                    Name = DateTime.Now.ToString("yyyyMMddHHmmssfff"),
                    Mobile = "00000"
                }, new string[] { "Name" }.ToList());
    
                watch.Stop();
                result = watch.Elapsed.TotalSeconds;
    
                return result;
            }
    
            public double DeleteBulkInsertTest()
            {
                double result = 0;
    
                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 = 0;
    
                System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch();
                watch.Start();
    
                this._UserInfoRepository.BatchDeleteBulkInsertTest(o => true);
    
                watch.Stop();
                result = watch.Elapsed.TotalSeconds;
    
                return result;
            }
        }
    }
  • 相关阅读:
    js 基础(面试前必看)
    typescript 使用的几种情况
    flutter 命令卡主的问题
    React 通过注释自动生成文档
    jest 测试入门(一)
    react hooks 全面转换攻略(三) 全局存储解决方案
    缓存穿透、击穿、雪崩区别和解决方案
    java8 lambda表达式
    maven中snapshot快照库和release发布库的区别和作用
    初识 Nacos 以及安装
  • 原文地址:https://www.cnblogs.com/jasonlai2016/p/11811068.html
Copyright © 2011-2022 走看看