SqlSugar小技巧 - 插入数据

SqlSugar 是一款 老牌 .NET 开源ORM框架,由果糖大数据科技团队维护和更新 ,开箱即用最易上手的ORM框架 。生态圈丰富,目前开源生态仅次于微软的EF Core。文章主要记录一些使用SqlSugar插入数据的小技巧

1 插入返回自增列

1
2
//插入返回自增列 (实体除ORACLE外实体要配置自增,Oracle需要配置序列)
int idPk = db.Insertable(student).ExecuteReturnIdentity();

2 插入返回返回雪花ID

1
2
3
4
5
6
7
8
//返回雪花ID 看文档3.0具体用法(在最底部)
Snowflake snowflakeModel = new Snowflake()
{
Name = "返回雪花ID",
SchoolId = 1
};
db.Deleteable<Snowflake>().ExecuteCommand();
long id = db.Insertable(snowflakeModel).ExecuteReturnSnowflakeId();

3 插入数据强制设置表名

1
2
强制设置表名(默认表名来自实体) 
db.Insertable(student).AS("dbstudent").ExecuteCommand();

4 插入字典数据

1
2
3
4
5
6
Dictionary<string, object> dc = new Dictionary<string, object>();
//不能写实体中的属性名,必须和数据库保持一致
dc.Add("StudentName", "字典插入");
dc.Add("SchoolId", 23);
dc.Add("CreateTime", DateTime.Now);
db.Insertable(dc).AS("dbstudent").ExecuteCommand();

5 插入匿名对象

1
2
3
4
5
6
7
8
var obj = new
{
StudentName = "匿名对象 插入",
CreateTime = DateTime.Now,
SchoolId = "456"
};

db.Insertable<Dictionary<string, object>>(obj).AS("[dbstudent]").ExecuteCommand();

6 忽略-不插入指定字段

1
2
3
4
5
db.Deleteable<Student>().ExecuteCommand();
//忽略 name SchoolId
int id = db.Insertable(student).IgnoreColumns(it => new { it.Name }).ExecuteReturnIdentity();

db.Insertable(student).IgnoreColumns("Name", "SchoolId").ExecuteReturnIdentity();

7 只插入指定字段

1
2
3
4
5
db.Deleteable<Student>().ExecuteCommand();
//忽略 name testid
int id = db.Insertable(student).InsertColumns(it => new { it.Name }).ExecuteReturnIdentity();

db.Insertable(student).InsertColumns("Name", "SchoolId").ExecuteReturnIdentity();

8 批量插入: 普通批量插入、参数化内部分页插入、大数据插入、分页插入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//(1)、普通批量插入 - 非参数化插入(防注入) 
//优点:综合性能比较平均,列少1万条也不慢,属于万写法,不加事务情况下部分库有失败回滚机质
//缺点:数据量超过5万以上占用内存会比较大些,内存小可以用下面2种方式处理
db.Insertable(addlist).ExecuteCommand();

//(2)、使用参数化内部分页插入
//优点:500条以下速度最快,兼容所有类型和emoji,10万以上的大数据也能跑,就是慢些,内部分批量处理过了。
//缺点:500以上就开始慢了,要加事务才能回滚
db.Insertable(addlist).UseParameter().ExecuteCommand();//5.0.3.8-Preview及以上版本支持(NUGET搜索勾上包括预览)

//(3)、大数据写入(特色功能:大数据处理上比所有框架都要快30%)
//优点:1000条以上性能无敌手
//缺点:不支持数据库默认值, API功能简单, 小数据量并发执行不如普通插入,插入数据越大越适合用这个
//新功能 5.0.44
db.Fastest<Student>().PageSize(100000).BulkCopy(addlist);
db.Fastest<Student>().BulkCopy(students);//性能 比现有任何Bulkcopy都要快30% 100w数据3s插入


//分页插入 ,如果不支持db.Fastest分页插入也是可以提升一下性能的 性能优于 参数化内部分页插入
db.Utilities.PageEach(addlist, 10, pageList =>
{
db.Insertable(pageList).ExecuteCommand();
});

9 插入数据Guid主键自动赋值

1
2
3
4
5
6
7
UserInfo user = new UserInfo()
{
Name = "Richard老师",
CreateTime = DateTime.Now,
};
// 需要model的Guid列为主键
db.Insertable(user).ExecuteCommand();

10 插入数据调用model的内部方法

1
2
3
4
5
db.CodeFirst.InitTables(typeof(UnitInsertMethod));
db.Deleteable<UnitInsertMethod>().ExecuteCommand();
db.Insertable(new UnitInsertMethod() { Name = "1" }).CallEntityMethod(it => it.Create()).ExecuteCommand();

db.Updateable(new UnitInsertMethod() { Name = "1" }).CallEntityMethod(it => it.modify("admint")).ExecuteCommand();

11 插入临时表

1
2
3
db.Ado.OpenAlways();//长连接
db.Queryable<UserInfo>().Select(" * into #temp").ToList();//插入临时表
var tempList = db.Queryable<dynamic>().AS("#temp").ToList();//查询临时表