.NET Dapper mysql 批量新增修改
2023-08-28 17:22:57来源:博客园
(资料图)
dapper是C#程序员比较喜欢用的轻量级ORM,简单易学,只是没有批量新增以及修改(收费版有),写了如下扩展
////// dapper MySQL批量新增修改扩展 /// public static class DapperExtensions { ////// 批量插入 /// ////// /// 表名 /// 数据列表 /// /// 主键相同修改字段 /// 事务 /// insert,replace,insert ignore /// public static async Task BulkInsert ( this IDbConnection connection, string tableName, IReadOnlyCollection items, Dictionary > dataFunc, IEnumerable ? duplicateData = null, IDbTransaction? dbTransaction = null, string insert = "INSERT") { const int MaxBatchSize = 5000; const int MaxParameterSize = 10000; var batchSize = Math.Min((int)Math.Ceiling((double)MaxParameterSize / dataFunc.Keys.Count), MaxBatchSize); var numberOfBatches = (int)Math.Ceiling((double)items.Count / batchSize); var columnNames = dataFunc.Keys; var insertSql = $"{insert} INTO {tableName} ({string.Join(",", columnNames.Select(e => $"`{e}`"))}) VALUES"; var sqlToExecute = new List >(); for (var i = 0; i < numberOfBatches; i++) { var dataToInsert = items.Skip(i * batchSize) .Take(batchSize); var valueSql = GetQueries(dataToInsert, dataFunc); sqlToExecute.Add(Tuple.Create($"{insertSql}{string.Join(",", valueSql.Item1)}", valueSql.Item2)); } var duplicate = string.Empty; if (duplicateData != null) { duplicate = $" ON DUPLICATE KEY UPDATE {string.Join(",", duplicateData.Select(d => $"`{d}`=VALUES(`{d}`)"))}"; } foreach (var sql in sqlToExecute) { await connection.ExecuteAsync(sql.Item1 + duplicate, sql.Item2, commandTimeout: int.MaxValue, transaction: dbTransaction); } } private static Tuple , DynamicParameters> GetQueries ( IEnumerable dataToInsert, Dictionary > dataFunc) { var parameters = new DynamicParameters(); return Tuple.Create( dataToInsert.Select(e => $"({string.Join(",", GenerateQueryAndParameters(e, parameters, dataFunc))})"), parameters); } private static IEnumerable GenerateQueryAndParameters ( T entity, DynamicParameters parameters, Dictionary > dataFunc) { var paramTemplateFunc = new Func (guid => $"@p{guid:N}"); var paramList = new List (); foreach (var key in dataFunc) { var paramName = paramTemplateFunc(Guid.NewGuid()); parameters.Add(paramName, key.Value(entity)); paramList.Add(paramName); } return paramList; } /// /// 批量更新 /// ////// /// 表名 /// 数据列表 /// /// /// 主键字段 /// 主键是否是数字类型 /// 事务 /// public static async Task BulkUpdate ( this IDbConnection connection, string tableName, IReadOnlyCollection items, Dictionary > dataFunc, Func primaryFunc, string primaryKey, bool isIntKey = true, IDbTransaction? dbTransaction = null) { const int MaxBatchSize = 5000; const int MaxParameterSize = 10000; var batchSize = Math.Min((int)Math.Ceiling((double)MaxParameterSize / dataFunc.Keys.Count), MaxBatchSize); var numberOfBatches = (int)Math.Ceiling((double)items.Count / batchSize); var columnNames = dataFunc.Keys; var updateSql = $"UPDATE {tableName} SET"; var sqlToExecute = new List >(); for (var i = 0; i < numberOfBatches; i++) { var dataToUpdate = items.Skip(i * batchSize) .Take(batchSize); var valueSql = GetUpdateQueries(dataToUpdate, dataFunc, primaryFunc, primaryKey, isIntKey); sqlToExecute.Add(Tuple.Create($"{updateSql}{valueSql.Item1}", valueSql.Item2)); } foreach (var sql in sqlToExecute) { await connection.ExecuteAsync(sql.Item1, sql.Item2, commandTimeout: int.MaxValue, transaction: dbTransaction); } } private static Tuple GetUpdateQueries ( IEnumerable dataToUpdate, Dictionary > dataFunc, Func primaryFunc, string primaryKey, bool isIntKey) { var paramTemplateFunc = new Func ((guid, entity) => { var keyValue = primaryFunc(entity); if (!isIntKey) { keyValue = $""{keyValue}""; } var param = $"@p{guid:N}"; var sql = $"WHEN {keyValue} THEN {param}"; return (param, sql); } ); var parameters = new DynamicParameters(); List sqlList = new(); foreach (var key in dataFunc) { var paramList = new List (); foreach (var e in dataToUpdate) { var (param, sql) = paramTemplateFunc(Guid.NewGuid(), e); parameters.Add(param, key.Value(e)); paramList.Add(sql); } sqlList.Add($"`{key.Key}`=CASE `{primaryKey}` {string.Join(" ", paramList)} END"); } object idFunc(T p) { return primaryFunc(p); } parameters.Add("@ids", dataToUpdate.Select(idFunc)); return Tuple.Create( $"{string.Join(",", sqlList)} WHERE `{primaryKey}` IN @ids", parameters); } }
使用方法:新增:
await conn.BulkInsert( "userInfo", //表名 userinfoList, //列表 new Dictionary> { {"Name", u => u.Name }, {"Age", u => u.Age }, {"Sex", u => u.Sex }, });
修改:
await conn.BulkUpdate("userInfo", userInfoList, new Dictionary> { {"Name", u => u.Name } {"Age", u => u.Age }, {"Sex", u => u.Sex }, }, new Func (u => u.ID), "ID");
标签:
电脑
-
电脑任务栏点击无反应怎么办?电脑任务栏一直转圈圈怎么办?
电脑任务栏点击无反应怎么办方法一、卸载补丁1、出现这个原因可能是某个windows10系统补丁更新,导致的...
-
电脑打字乱码怎么办?串口显示乱码的原因有哪些?
电脑打字乱码怎么办?1、在桌面上新建一个名为TEST的文本文档并打开。2、我们在文本文档中输入你好两个字...
-
台式机或笔记本摄像头不显示怎么办?电脑弹窗提"无法定位序数"怎么办?
台式机或笔记本摄像头不显示怎么办摄像头黑屏问题解决方法:1、检查摄像头是否损坏,如果您的摄像头是内...
-
电脑网络适配器有感叹号怎么办?读卡器插电脑读取失败怎么办?
电脑网络适配器有感叹号怎么办?解决方法:方法1、右键点击驱动程序,然后选择卸载,卸载之后再重新启动...
硬件
- MBR和GPT的区别有哪些?MBR和GPT怎么选择?
- SSD能用多久在哪看?硬盘中缓存有什么用?
- m.2和SATA区别大吗 ?买M.2 NVME要注意什么?
- 固态硬盘应该怎么选择?m.2固态硬盘和ssd固态硬盘哪款好?
- u盘文件found怎么恢复? 什么叫U盘量产?
- u盘能在手机上用吗?手机如何直接连接u盘?
- u盘建议买多大内存?什么u盘质量最好最耐用?
- u盘发烫怎么办?u盘发烫不识别怎么办?
- U盘分配单元大小怎么设置?电脑不显示u盘盘符怎么办?
- 如何将大于4g的文件拷贝到u盘?U盘显示0字节怎么办?
- 固态u盘和普通u盘有什么区别 ?怎么解除U盘保护?
- 电脑怎么连接打印机?电脑怎么连接电视?
- 电脑怎么连上蓝牙音响?蓝牙耳机连接电脑后没有声音该怎么办?
- 怎么看电脑有没有声卡?结束不了系统进程怎么办?
- .NET Dapper mysql 批量新增修改
- 「自贡」又是一年开学季!“金秋助学”,圆梦起航暖人心
- 年轻时候刘嘉玲究竟有多美(岁月是杀猪刀54岁刘嘉玲)
- (崩坏:星穹铁道×特摄)序章,召唤怪兽的男人
- 不追随梅罗!名记确认拉莫斯将留在欧洲联赛 37岁依旧拿队内顶薪
- 国内点对点短信0.1元/条移动(国内点对点短信)
- 高潭镇开展形式多样活动丰富青少年暑假生活
- 联泰基金市场周报(8月21日-8月27日):保持底线思维
- 胶州市市南小区社区:消夏晚会送清凉
- 今夏流行“雪上飘”
- 和铂医药-B(02142)发布中期业绩,股东应占溢利292.2万美元
- 存量竞争的家电行业,四川长虹以技术突围|看财报
- 魏牌高山成都车展开启预订,强势入局大七座高端MPV市场
- 过去几次降印花税,最少也能涨7天!这次就开盘一分钟
- 什么是卵圆孔未闭
- 如何治疗银屑病
- 逆水寒手游无影拳怎么获得 逆水寒手游无影拳动作获取攻略
- 顺控发展参设泓铖能源 含集成电路芯片销售业务
- 克孜尔石窟咨询电话是多少
- 血液透析患者的自我管理
- 如何预防腰椎间盘突出症
- 医院卫生管理培训包括哪些方面
- 二十四节气养生要点
- 中西医结合治疗脾胃病
- 冠城大通8月28日盘中涨停
- 了解手术麻醉知识
- 胆结石的超声诊断
- 小儿如何进行超声检查
- 听懂宝宝胎动传递的“语言”
- 无痛分娩
- 注册环节严格把关 8家企业过会后终止注册
- 在一场暑期公益夏令营中双向治愈
- 养宠物兔的正确方法和技巧(如何养好一只宠物兔
- 4000公里外的孩子:感谢无锡爱心企业送来珍贵的“开学礼”
- 传苹果iPad Pro 2024款“彻底改革”:首配OLED屏,包括13英寸型号
- 携程发布《2023年暑期出游市场报告》:兰州吸引力持续攀升,省博获人气顶流
- 滕哈格骂曼联白送对手两球,披露瓦拉内伤情!自信客场能赢阿森纳
- 做“热”文化 做“活”赛事 做“火”旅游
- 领数智进化 向美好跃迁 长安启源品牌正式发布
- 江苏南京市气象台升级发布暴雨黄色预警
- 《骄阳伴我》是什么时候拍摄的 《骄阳伴我》是不是上星剧
- pos机的简短推销技巧是什么_pos机的简短推销技巧
- 上市券商2022年度分红合计超410亿元 8家股利支付率超50%
- 北约要认输,泽连斯基不干了,未料美国会给出一个噩耗逼乌军投降
- 美国商务部部长雷蒙多抵达北京
- 全场震惊!公安局正在开会,所长被当场带走
- 新华全媒+丨山东:打造绿水青山秀美家园
- 氛围拉满!亚运会,杭州准备好了
- 城中村人物志丨穿过窄巷才发现 原来外卖小哥也有“聚集地”
- 菅又刃兵卫(关于菅又刃兵卫简述)
- 门头沟区基本完成灾后现状摸排与规划评估工作
- 赣能股份:上半年归母净利润1.35亿元,同比增长288.5%
- 近来瓜子嗑少了?洽洽食品股价跌停创三年新低,业绩增收不增利
- 百川畅银:拟14亿元投建年产4GW高效异质结电池项目
- 洽洽食品上半年增收不增利 下半年能否改善 有以下可能
- 财政部、税务总局:8月28日起,证券交易印花税实施减半征收
- 妈妈欲买海鲜囤满3米长冰柜惊呆儿子 具体是什么情况!
- 注意:上海发布雷电黄色预警!“苏拉”又升级了!8月底至9月初上海将出现明显降水
- 加入金砖,这两国独立于美国的能力增强了
- 争光股份:2023年半年度净利润约5134万元 同比增加7.49%
- 此时对房地产落井下石:是格局太小、低智商表现
- 学生意外险报多少?能够理赔多少次?
- 16岁少女欲轻生 警察不停嘶吼“求求你了”
- 开源证券:给予天康生物买入评级
- 蔚来手机性能曝光:发售价17999元或超iPhone X
- 《我们的客栈》侵权《武林外传》?《武林外传》官方发声
- 菏泽号护卫舰(关于菏泽号护卫舰简述)
- 笔记本电脑怎么下载app(电脑下载软件在哪里下载)
- 易我数据恢复向导v2.0注册码(易我数据恢复向导v2 0)
- 火车卧铺能不能自带个“床帘”?12306回应
- 反意疑问句的回答方式要加后缀吗_反意疑问句的回答方式
- 品牌策划岗位职责(西安品牌策划哪家好)
- 八月稻飘香 中稻收割忙
- 巴萨VS黄潜首发曝光:德容坐镇后防,京多安领衔中场,莱万冲锋
- 印乘客带煤气瓶上火车做饭引发爆炸
- 排列三23229期鱼儿说三预测:十位小码
- 「潍坊天气」8月27日,舒适,中雨转小雨,西风1级
- 长安小货车要货运资格证吗(长安微型货车要货运资格证吗)
- 红米手机怎样查询流量使用情况
- 英超积分榜:铁锤帮西汉姆暂登顶,阿森纳第3曼联第6,埃弗顿0分0球垫底
- 两岸校长答中评:互享经验 厚植两岸情谊
- 李东林(对于李东林简单介绍)
- 莴笋鱼片汤(关于莴笋鱼片汤简述)
- 游戏功夫派成员详细资料(功夫派 2010年淘米发行的角色扮演类网页游戏)
- 王丽坤都被她比下去了?14岁美少女撞脸杨幂关晓彤
- 化纤股票一览表,化纤概念股整理(8/25)
- 法院邀请居民当“法官”,就地调解邻里纠纷
- 死神226集接到多少集(死神206集以后讲些什么)
- 长沙的海鲜都来自哪里?能不能放心吃?
- 车网在哪里?
- 浙商证券及3名分析师收警示函 研报业务存在三类问题
- 日本想在这些方面“挽回颓势”
- 城乡居民养老保险怎么参保?享受养老保险条件和标准?
- 2023海口经济圈消费提振年丨海口各大免税、商圈实力“宠粉”,凭演唱会门票享多重好礼啦~
- 土蜂蜜和一般的普通蜂蜜有何区别?看完别再稀里糊涂地买蜂蜜
- 雷军良心,小米汽车只赚1%利润?比手机的5%还要低?
- 中国常驻国际原子能机构代表团发言人:日方严重损害国际原子能机构权威
- 网游陪玩起纠纷 法官调解达一致
- 巴西狂欢节的穿衣特点(巴西狂欢节)
- 合同到期终止是解除合同还是终止
电竞
数码
事件
- 上海的进口海鲜还安全吗?实探沪上唯一国家一级渔港08-28
- 财政部、国家税务总局:多项个人所得税优惠政策延续实施08-28
- 为海洋物联网等未来产业提供智力支撑,青岛科技信息院与山东创发院签约08-28
- 违背一个中国原则,海关在出口货运渠道查获2994个“问题地球仪”08-28
- 青岛市防汛抗旱指挥部:解除防汛防台风预警终止四级应急响应08-28
- 每年培训专业技术人员20万人次!青岛实施新一轮知识更新工程08-28
- 晨丰科技(603685)8月28日主力资金净卖出214.03万元08-28
- 昼夜奋战、全员上岗!青岛全力做好防汛工作,保障道路通行顺畅08-28
- 青岛疾控发布开学健康提醒,这项筛查很有必要08-28
- 我国拟制定学前教育法:幼儿园不得采用小学化的教育方式08-28
- 深读 | 鸡鸭“上楼”,鲟鱼“上岸”,养殖业正经历大洗牌?08-28
- 提前部署警力,保证道路通畅!开学首日逢雨天青岛交警“护学”忙08-28
- 首套20%、二套30%!今起,青岛非限购区公积金贷款首付比例下调08-28
- 漫迪医疗完成近亿元A+轮融资08-28
- A股无悬念大涨,三大股指集体高开超5%08-28