HTML5技术

.NET ORM框架 SqlSuagr4.0 功能详解与实践【开源】 - 孙凯旋

字号+ 作者:H5之家 来源:H5之家 2017-06-19 17:00 我要评论( )

SqlSugar 4.0 ORM框架的优势 为了未来能够更好的支持多库分布式的存储,并行计算等功能,将SqlSugar3.x全部重写,现有的架构可以轻松扩展多库。 源码下载: https://github.com/sunkaixuan/SqlSugar 1.性能 性能最好的ORM之一,具有超越Dapper的性能 ,走的是E

SqlSugar 4.0 ORM框架的优势

为了未来能够更好的支持多库分布式的存储,并行计算等功能,将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();

排序

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • Asp.Net WebForm生命周期的详解 - 天使不哭

    Asp.Net WebForm生命周期的详解 - 天使不哭

    2017-06-15 09:00

  • 一个微服务框架的故事 - wc的一些事一些情

    一个微服务框架的故事 - wc的一些事一些情

    2017-06-14 10:04

  • 高性能迷你React框架anu在低版本IE的实践 - 司徒正美

    高性能迷你React框架anu在低版本IE的实践 - 司徒正美

    2017-06-14 09:01

  • 关于ASP.NET WebForm与ASP.NET MVC的比较 - 天使不哭

    关于ASP.NET WebForm与ASP.NET MVC的比较 - 天使不哭

    2017-06-09 09:02

网友点评
n