为了未来能够更好的支持多库分布式的存储,并行计算等功能,将SqlSugar3.x全部重写,现有的架构可以轻松扩展多库。
源码下载:
https://github.com/sunkaixuan/SqlSugar
1.性能
性能最好的ORM之一,具有超越Dapper的性能 ,走的是EMIT够构中间语言动态编译到程序集,完成高性能的实体绑定,达到原生水平。
测试方式用Realease模式,Realease DLL 进行的车轮战
2.功能
除了EF以外可以说的是功能最大的ORM框架
支持 DbFirst、CodeFirst、数据库维护、链式查询、链式更新、链式删除、链式插入、实体属性、复杂模型的查询、ADO.NET。特别是批量等功能都是货真价实的并非循环操作。
SqlSugar 4.0版本 6月底支持SqlSever的Core版 ,预计7月份支持多库,8月分开始分布式ORM的开发。 (3.x版本已经支持了4种数据库,相对稳定功能简单)
3.语法
完美的语法,可以秒杀现有所有ORM框架
SqlSugar 4.0 三表查询并分页
int total=0;
var list8 = db.Queryable<Student,School,School>((st,sc,sc2) =>st.SchoolId ==sc.Id&&sc.Id ==sc2.Id)
.Select((st, sc, sc2) =>new{st.Name,st.Id,schoolName = sc.Name})
.ToPageList(1, 2,ref total)
EF 二表查询并分页
var queryable = (from a in StudentList join b in SchoolList1 on a.Id equals b.Id into b1 from b2 in b1.DefaultIfEmpty() select new { a.Id, a.Name, t = b2.Name }); var listp = queryable.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList(); var total = queryable.Count();
从上面的语法可以看出两者之前的差距,3表查询比EF2表查询还要简洁
我们在来看一下条件拼接的例子
SqlSugar语法:
var list = db.Queryable<Student>() .WhereIF(!string.IsNullOrEmpty(a),it => it.Name == a) .WhereIF(!string.IsNullOrEmpty(b), it => it.Name == b).ToList();
EF语法:
var queryable = db.Queryable<Student>(); if (!string.IsNullOrEmpty(a)) { queryable = queryable.Where(it => it.Name == a); } if (!string.IsNullOrEmpty(b)) { queryable = queryable.Where(it => it.Name == b); } var list = queryable.ToList();
是不是简单很多呢?
4.轻量级总大小只有200多K,比EF的一个小插件都小,EF主体有5M
5.持续更新
本来4.X预计3月份就可以开发完成的,因为换了新公司半年都是996工作制,我只有周日和晚上有时间开发,可以说我基本都没有休息过。下半年工作不会这么紧,我的时间会更充足一些。
功能详解
SqlSugar 4.X 总共有九大核心功能,并且都设计为链式操作,链式操作有什么好处?
第一链式操作可以减少方法的重载
第二链式操作可以让代码更加易读,举个例子一个方法有很多重载,你在写的代码就不清楚这些重载是做嘛的,需要F12到方法主体去看备注。
例如:第一种写法就能清楚的知道 是否建创属性,并且只创建Student这张表的文件,第二种方法虽然简单不易读
db.DbFirst.IsCreateAttribute().Where().CreateClassFile();
db.DbFirst.CreateClassFile(true,"Student",);
第三链式操更具有扩展性 例如有1234 我可以1和2一组,234一组 1和4一组,如果是重载的方式至少要有十个以上的重载后期将很难维护,功能越多后期易读越差,也不灵活。
1.Queryable
查询的核心对象,可以实现多表查询,分组查询,分页,支持SqlFunc函数和拉姆达解析,除EF外也是对拉姆达解析支持最好的ORM之一
简单查询
查询所有
var getAll = db.Queryable<Student>().ToList();
无锁查询
var getAllNoLock = db.Queryable<Student>().With(SqlWith.NoLock).ToList();
根据主键查询
var getByPrimaryKey = db.Queryable<Student>().InSingle(2)
查询单条没有数据返回NULL, Single超过1条会报错,First不会
var getSingleOrDefault = db.Queryable<Student>().Single(); var getFirstOrDefault = db.Queryable<Student>().First();
IN查询
in1 = db.Queryable<Student>().In(it=>it.Id,new int[] { 1, 2, 3 }).ToList(); in2 = db.Queryable<Student>().In(new int[] { 1, 2, 3 }).ToList(); [] array = new int[] { 1, 2 }; var in3 = db.Queryable<Student>().Where(it=>array.Contains(it.Id)).ToList();
NOT IN查询
var in3 = db.Queryable<Student>().Where(it=>!array.Contains(it.Id)).ToList();
多条件查询
).ToList();
使用函数 SqlFunc类
var getByFuns = db.Queryable<Student>().Where(it => SqlFunc.IsNullOrEmpty(it.Name)).ToList();
可以使用 SUM MAX MIN AVG查询单个字段
var sum = db.Queryable<Student>().Sum(it => it.Id);
Between 1 and 20
var between = db.Queryable<Student>().Where(it => SqlFunc.Between(it.Id, 1, 20)).ToList();
使用 AS 取新的表名
).ToList();
排序