一、数据导入有哪些难题

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的更多相关文章

  1. 【巨杉数据库SequoiaDB】巨杉Tech | 巨杉数据库数据高性能数据导入迁移实践

    SequoiaDB 一款自研金融级分布式数据库产品,支持标准SQL和分布式事务功能.支持复杂索引查询,兼容 MySQL.PGSQL.SparkSQL等SQL访问方式.SequoiaDB 在分布式存储功 ...

  2. Excel表数据导入数据库表中

    ***Excel表数据导入到数据库表中 通过数据库表的模板做成‘Excel’表的数据导入到数据库相应的表中(注意:主表 和 从表的关系,要先导‘主表’在导入从表) 过程:通过数据库的导入工具—先导入为 ...

  3. C#开发的高性能EXCEL导入、导出工具DataPie(支持MSSQL、ORACLE、ACCESS,附源码下载地址)[转]

    转自:http://www.cnblogs.com/yfl8910/archive/2012/05/19/2509194.html 作为财务数据核算人员,面对大量的业务与财务数据,借助于传统的EXCE ...

  4. MySQL学习记录(导入Excel表到数据库,并筛选条件输出)

    附上:重置mysql账号密码方法 ubuntu系统下mysql重置密码和修改密码操作 - skh2015java的博客 - CSDN博客(改完重启,登录mysql要root/sudo权限) Cento ...

  5. Oracle数据导入指定表空间

    1. 打开工具Oracle SQL Plus 以dba身份登录sys用户 sqlplus /nologconn sys@url as sysdba 2. 创建用户并指定表空间 使用客户端工具或者Web ...

  6. SQL语句完成Excel数据导入数据库表中流程方法及注意事项

    第一步:先查看数据库是否安装AccessDatabaseEngine_X64.exe, 如下图查看: 如果未安装先下载脚本之家下载地址 https://www.jb51.net/softs/29150 ...

  7. 将excel数据导入内表的函数

    call function 'TEXT_CONVERT_XLS_TO_SAP'    exporting      i_tab_raw_data       = lt_raw "开始行    ...

  8. Hive 将本地数据导入hive表中

    # 导入 load data local inpath '/root/mr/The_Man_of_Property.txt' insert into table article; # 提示 FAILE ...

  9. Oracle 创建表空间及用户授权、dmp数据导入、表空间、用户删除

    1.创建表空间 // 创建表空间 物理位置为'C:\app\admin\oradata\NETHRA\NETHRA.DBF',初始大小100M,当空间不足时自动扩展步长为10M create tabl ...

随机推荐

  1. BCC和libbpf的转换

    BCC和libbpf的转换 本文讲述如何将基于BCC的BPF应用转换为libbpf + BPF CO-RE.BPF CO-RE可以参见上一篇博文. 为什么是libbpf和BPF CO-RE? 历史上, ...

  2. 索引失效 -- 使用Between范围查询时

    需求说明 产品需要统计一段时间范围内每月用户的注册人数(根据用户信息表中的创建时间),需要我通过SQL导出数据,但是数据量太大,导出需要20多秒,于是我尝试在创建时间字段中加索引,但是发现加了索引后索 ...

  3. 知识图谱和neo4j的基本操作

    一.知识图谱的简介 1.知识图谱是什么 知识图谱本质上是语义网络(Semantic Network)的知识库 可以理解为一个关系图网络. 2.什么是图 图(Graph)是由节点(Vertex)和边(E ...

  4. Dota游戏匹配的所有组合

    在Dota游戏中有一种匹配玩法,任意5人以下玩家组队,加入匹配系统,由系统组合出5人 vs 5人的组合进行游戏,比如2人+3人  vs 1人+4人.抽象出这个问题,就变成两边各有m个玩家,最多允许n个 ...

  5. 简单TCP服务器和TCP客户端源码(Golang)

    以下代码为服务端,非最终版代码,服务端可以接受多个客户端的请求,且所有消息会显示在服务端上,服务端无法发送消息: package main import ( "fmt" " ...

  6. Centos 安装 Node-v12.17.0-linux-x64.tar.gz

    wget https://nodejs.org/dist/v12.17.0/node-v12.17.0-linux-x64.tar.gz tar -zxf node-v12.17.0-linux-x6 ...

  7. python模块详解 | psutil

    目录 psutil 简介 psutil的功能函数 cpu memory_内存 disk_磁盘 net_网络 pid_进程管理 sensors_传感器 其他(用户,启动时间) psutil简介 psut ...

  8. SQL Server management studio使用sa连接时报错与伺服器的连接已成功,但在登入程序是发生错误

    使用Sql Server management studio的sa用户连接数据库时,报如下错误 解决方法: 1.使用windows验证登录 2.右键点击连接,点击属性,点击安全性,选择混合验证 3.重 ...

  9. 开篇:免费开源的趣讲 ZooKeeper 教程(连载)

    本文作者:HelloGitHub-老荀 一.起因 良好的开端,是成功的一半. 我是作者老荀,一个普通的程序员,没有 985 和 211 的背景,也从没在大厂工作过.仅仅是喜欢研究技术,一直想做一个讲解 ...

  10. IP2726中文规格书

    IP2726_AC_FBR 是一款集成多种协议.用于USB-A 和 TYPE-C 双端口输出的快充协议 IC.支持多种快充协议,包括 USB TypeC DFP,PD2.0/PD3.0/PPS ,HV ...