高性能数据导入方案&表过滤器&一对多支持筛选- .NET SqlSugar ORM
一、数据导入有哪些难题
1、数据分类
你需要将 插入、更新、忽略不计、错误数据 等进么分类汇总,最后返回给客户,如果没有很好的设计想把这些操作一步到位非常的难
2、高性能
对于插入或者更新 肯定不能单纯的插入或者更新,一定要批量操作,或者用到blukcopy操作
3、数据验证
对于错误数据要进行组装 ,并返回客户,让客户知道哪些字段 哪个数据出现错误
二、使用 Storageable 解决难题
我们可以使用SqlSugar ORM中的 Storageable功能来解决上面的几大难题 ,SqlSugar 作为老牌ORM框架一直在创新和更新
1、入门示例
如何用Storageable实现简单的插入或者更新
例题1:导入一个List ,当id等0插入, id>0执行更新 (id是主键 )
- List<UinitBlukTable> list2 = new List<UinitBlukTable>();
- list2.Add(new UinitBlukTable() { Id = 1, Name = "a", Create = DateTime.Now });
- list2.Add(new UinitBlukTable() { Id = 2, Name = "a", Create = DateTime.Now });
- list2.Add(new UinitBlukTable() { Id = 0, Name = "a", Create = DateTime.Now });
- var x = Db.Storageable(list2)
- .SplitUpdate(it => it.Item.Id > 0)
- .SplitInsert(it => it.Item.Id == 0).ToStorage();
- x.AsInsertable.ExecuteCommand();
- x.AsUpdateable.ExecuteCommand();
例题2:导入一个LIST,当Id存在数据执行更新,否则执行插入
- var x = Db.Storageable(list2)
- .SplitUpdate(it => it.Any(y=>y.Id==it.Item.Id))//数据库存在更新
- .SplitInsert(it => true ).ToStorage();//其余插入
- x.AsInsertable.ExecuteCommand(); //也可以使用blukcopy 参考SqlSugar blukcopy用法
- x.AsUpdateable.ExecuteCommand();
如果实体没有主键我们可以用
- var x = Db.Storageable(list2)
- .SplitUpdate(it => it.Any(y=>y.Id==it.Item.Id))
- .SplitInsert(it => it.NotAny(y => y.Id == it.Item.Id))
- .WhereColumns(it=>it.Id).ToStorage(); //以id作为数据库唯一列,当然支持多个 new {it.id,it.name}
2.数据验证和统计
准备4条测试数据
- List<UinitBlukTable> list2 = new List<UinitBlukTable>();
- list2.Add(new UinitBlukTable() { Id = 1, Name = "a", Create = DateTime.Now });
- list2.Add(new UinitBlukTable() { Id = 2, Name = "a", Create = DateTime.Now });
- list2.Add(new UinitBlukTable() { Id = 3, Name = "a", Create = DateTime.Now.AddYears(-2) });
- list2.Add(new UinitBlukTable() { Id = 4, Name ="", Create = DateTime.Now.AddYears(-2) });
编写代码将错误数据、可插入数据、可更新数据等进行分类
- var x = Db.Storageable(list2)
- .SplitError(it => string.IsNullOrEmpty(it.Item.Name), "名称不能为空")
- .SplitError(it => it.Item.Create<DateTime.Now.AddYears(-1),"不是今年的数据")
- .SplitUpdate(it => it.Any(y=>y.Id==it.Item.Id))//存在更新
- .SplitInsert(it => true)//剩余的插入
- .ToStorage();
- Console.WriteLine(" 插入 {0} 更新{1} 错误数据{2} 不计算数据{3} 删除数据{4},总共{5}" ,
- x.InsertList.Count,
- x.UpdateList.Count,
- x.ErrorList.Count,
- x.IgnoreList.Count,
- x.DeleteList.Count,
- x.TotalList.Count
- );
执行代码输出结果:
我们可以看到其中有1条可以插入的,1条可以更新的,并且2条数据数据
输出错误明细:
- foreach (var item in x.ErrorList)
- {
- Console.WriteLine("id等于"+item.Item.Id+" : "+item.StorageMessage);
- }
我们可以看到输出id3和id4是错误的,并且可以输出具体的错误明细
执行更新和插入
- x.AsInsertable.ExecuteCommand();
- x.AsUpdateable.ExecuteCommand();
三、使用表过滤器
SqlSugar以前也支持了全局过滤器,不过不好用,大部分用户习惯了以表的方式实现过滤器,用法如下
1、创建表过滤器
- SqlSugarClient db = new SqlSugarClient(new ConnectionConfig() { DbType = DbType.SqlServer, ConnectionString = Config.ConnectionString, IsAutoCloseConnection = true });
- db.QueryFilter.Add(new TableFilterItem<Order>(it => it.Name.Contains("a"))); //只有表Order才会生效
2、生效的查询语句
使用了表过滤器后只要带有order表的查询语句,都会自动添加一个条件
- db.Queryable<Order>().ToList();
- //SELECT [Id],[Name],[Price],[CreateTime],[CustomId] FROM [Order] WHERE ([Name] like '%'+@MethodConst0+'%')
- db.Queryable<OrderItem, Order>((i, o) => i.OrderId == o.Id)
- .Where(i => i.OrderId != 0)
- .Select("i.*").ToList();
- //SELECT i.* FROM [OrderDetail] i ,[Order] o WHERE ( [i].[OrderId] = [o].[Id] ) AND ( [i].[OrderId] <> @OrderId0 ) AND ([o].[Name] like '%'+@MethodConst1+'%')
3、禁止全局过滤器
- db.Queryable<Order>().Filter(null, false).ToList();
- //SELECT [Id],[Name],[Price],[CreateTime],[CustomId] FROM [Order]
四、一对多查询支持条件过滤
sqlsugar对于导航查询也是支持的越来越好,下面是一对多查询后在过滤的例子
- var list7= Db.Queryable<Order>()
- .Mapper(it => it.Items, it => it.Items.First().OrderId)
- .Where(it => it.Items.Any(y => y.ItemId == 1)) //以前只支持.any()
- .ToList();
五、总结
SqlSugar所有功能都真实来自于客户,并且是多个客户共同的需求,其实我并没有做到什么创新,只是在客户的基础上把他们想要的功能进行了一些设计,如果他们用了不满意,我在这个基础上在
慢慢的修改
源码下载:
https://github.com/donet5/SqlSugar sqlsugar已经持续更新6年之久,也越来越完善 ,如果说EF或者完它ORM不更新了,那么多一个开源就是多一个选择
高性能数据导入方案&表过滤器&一对多支持筛选- .NET SqlSugar ORM的更多相关文章
- 【巨杉数据库SequoiaDB】巨杉Tech | 巨杉数据库数据高性能数据导入迁移实践
SequoiaDB 一款自研金融级分布式数据库产品,支持标准SQL和分布式事务功能.支持复杂索引查询,兼容 MySQL.PGSQL.SparkSQL等SQL访问方式.SequoiaDB 在分布式存储功 ...
- Excel表数据导入数据库表中
***Excel表数据导入到数据库表中 通过数据库表的模板做成‘Excel’表的数据导入到数据库相应的表中(注意:主表 和 从表的关系,要先导‘主表’在导入从表) 过程:通过数据库的导入工具—先导入为 ...
- C#开发的高性能EXCEL导入、导出工具DataPie(支持MSSQL、ORACLE、ACCESS,附源码下载地址)[转]
转自:http://www.cnblogs.com/yfl8910/archive/2012/05/19/2509194.html 作为财务数据核算人员,面对大量的业务与财务数据,借助于传统的EXCE ...
- MySQL学习记录(导入Excel表到数据库,并筛选条件输出)
附上:重置mysql账号密码方法 ubuntu系统下mysql重置密码和修改密码操作 - skh2015java的博客 - CSDN博客(改完重启,登录mysql要root/sudo权限) Cento ...
- Oracle数据导入指定表空间
1. 打开工具Oracle SQL Plus 以dba身份登录sys用户 sqlplus /nologconn sys@url as sysdba 2. 创建用户并指定表空间 使用客户端工具或者Web ...
- SQL语句完成Excel数据导入数据库表中流程方法及注意事项
第一步:先查看数据库是否安装AccessDatabaseEngine_X64.exe, 如下图查看: 如果未安装先下载脚本之家下载地址 https://www.jb51.net/softs/29150 ...
- 将excel数据导入内表的函数
call function 'TEXT_CONVERT_XLS_TO_SAP' exporting i_tab_raw_data = lt_raw "开始行 ...
- Hive 将本地数据导入hive表中
# 导入 load data local inpath '/root/mr/The_Man_of_Property.txt' insert into table article; # 提示 FAILE ...
- Oracle 创建表空间及用户授权、dmp数据导入、表空间、用户删除
1.创建表空间 // 创建表空间 物理位置为'C:\app\admin\oradata\NETHRA\NETHRA.DBF',初始大小100M,当空间不足时自动扩展步长为10M create tabl ...
随机推荐
- Qt学习笔记-制作一个计算器-对话框Message Box
在做计算器的前提先做一个加法器. 设计界面. 在点击计算的时候,获取前两个输入框中的数据相加后显示在第三个输入框. toInt是将字符串转换为数字.number静态函数是将数字转化为字符串. 加法器已 ...
- 解决使用Navicat等工具进行连接登录mysql的1521错误,(mysql为8.0版本)
mysql 8.0的版本的加密方式和以前的不一样,因此使用Navicat等工具进行连接的时候,会报1521的异常. 解决方法如下: 登录mysql的命令行工具,输入如下代码: ALTER USER ' ...
- 一文讲尽门面日志slf4j和log4j、log4j2、logback依赖jar引用关系
公众号Mac代码分割阅读链接 前言 之前都是使用SparkStreaming开发,最近打算学习一下Flink,就从官网下载了Flink 1.11,打算搞一个客户端,将程序提交在yarn上.因为Flin ...
- NC65在日常开发中常用的代码写法
标题 NC65开发相关代码 版本 1.0.1 作者 walton 说明 收集NC在日常开发中常用的代码写法,示例展示 1.查询 1.1 通过BaseDAO查询结果集并转换 //通过BaseDAO进行查 ...
- 实战Git命令(界面操作+命令行)
先说明下公司的发版步骤,当需要开发一个新的功能,先从master分支中拉出一个自己的分支a(假设分支为a),在a分支开发功能完后,需要切换到dev分支,然后把自己的分支a合到dev分支,部署测试环境让 ...
- 浅谈.NET技术公司的实习生培养
浅谈.NET技术公司的实习生培养 背景 近几年.NET开发者市场的越发不景气,一毕业就选择.NET技术的开发者更是少之又少.一方面是公司效益的日益提高,一方面却是招聘优秀人才的速度总是赶不上公司发展的 ...
- Go从入门到放弃(笔记存档)
前言 考虑到印象笔记以后不续费了,这里转存到博客园一份 因内容是自己写的笔记, 未作任何润色, 所以看着很精简, 请见谅 查看官方文档 在新的go安装包中,为了减小体积默认去除了go doc 安装go ...
- 【Flutter】容器类组件之Scaffold、TabBar、底部导航
前言 一个完整的路由页可能会包含导航栏.抽屉菜单(Drawer)以及底部Tab导航菜单等.Flutter Material组件库提供了一些现成的组件来减少开发任务.Scaffold是一个路由页的骨架, ...
- wpf 中用 C# 代码创建 PropertyPath ,以对间接目标进行 Storyboard 动画.
如图,一个 Rectangle 一个 Button ,点击按钮时要通过动画完成对 Rectangle填充色的渐变动画. Xaml: 1 <Window 2 x:Class="WpfAp ...
- 虚拟机linux共享文件夹
linux共享文件夹问题 1. 初配置 2. 挂载 018.7.8 为了实现win7与VMware中linux文件夹共享很花费了一些时间,但终成正果 1. 初配置 虚拟机设置->选项->共 ...