轻量级、高性能SQL ORM 之 SqlSugar - ASP.NET

SqlSugar轻量ORM

SqlSugar是一款轻量级的MSSQL ORM ,除了具有媲美ADO的性能外还具有和EF相似简单易用的语法。

一、介简

优点:

1、优越的性能,使用  reflection.emit + cache   接近纯手工 DataReader的查询速度

2、大量语法糖,拉姆达表达示筛选,新颖的多表查询 ,方便的分页等

3、支持NOLOCK查询,提高性能

4、支持事务

5、内置实体类生成函数,无需使用第三方代码生成器

6、简单好用、例子齐全有问必答。

缺点:

目前只支持MSSQL,以后会全面发展

组成:

sqlSugar是由sqlSugarClientr提供统一调用模式 ,sqlSugarClientr是由5个部分组成

1、自身函数

2、实体生成

3、单表查询

4、多表查询

5、基类函数

如图:

二、使用教程

查询

 

1、单表或者单视图查询:

通过调用 db.Queryable() 的相关扩展函数 轻松搞定单表查询

        using (SqlSugarClient db = new SqlSugarClient(connStr))//开启数据库连接
        {

                   //查询所有
                    var student = db.Queryable<Student>().ToList();

                    //查询单条
                    var single = db.Queryable<Student>().Single(c => c.id == 1);

                    //取10-20条
                    var page1 = db.Queryable<Student>().Where(c => c.id > 10).OrderBy("id").Skip(10).Take(20).ToList();
                    //上一句的简化写法,同样取10-20条
                    var page2 = db.Queryable<Student>().Where(c => c.id > 10).OrderBy("id").ToPageList(2, 10);

                    //查询条数
                    var count = db.Queryable<Student>().Where(c => c.id > 10).Count();

                    //从第2条开始以后取所有
                    var skip = db.Queryable<Student>().Where(c => c.id > 10).OrderBy("id").Skip(2).ToList();

                    //取前2条
                    var take = db.Queryable<Student>().Where(c => c.id > 10).OrderBy("id").Take(2).ToList();

                    // Not like
                    var notLike = db.Queryable<Student>().Where(c => !c.name.Contains("a".ToString())).ToList();

                    // 可以在拉姆达使用 ToString和 Convert,比EF出色的地方
                    var convert1 = db.Queryable<Student>().Where(c => c.name == "a".ToString()).ToList();
                    var convert2 = db.Queryable<Student>().Where(c => c.id == Convert.ToInt32("1")).ToList();//
                    var convert3 = db.Queryable<Student>().Where(c => DateTime.Now > Convert.ToDateTime("2015-1-1")).ToList();
                    var convert4 = db.Queryable<Student>().Where(c => DateTime.Now > DateTime.Now).ToList();

                    //支持字符串Where 让你解决,更复杂的查询
                    var student12 = db.Queryable<Student>().Where(c => 1 == 1).Where("id>@id",new{id=1}).ToList();

      }

  

                   //存在记录反回true,则否返回false
                    bool isAny100 = db.Queryable<Student>().Any(c => c.id == 100);
                    bool isAny1 = db.Queryable<Student>().Any(c => c.id == 1);

2、单表高级查询

根据条件查询并分页 

   /// <summary>
        /// 根据条件查询并且分页
        /// </summary>
        /// <param name="name"></param>
        /// <param name="sex"></param>
        /// <returns></returns>
        public static List<Student> GetStudent(string name, string sex,int pageIndex, int pageSize, string orderFileds)
        {
            using (SugarDao db = new SugarDao())
            {
                var qable = db.Queryable<Student>();
                if (!string.IsNullOrEmpty(name))
                {
                    qable = qable.Where(it => it.name.Contains(name));
                }
                if (!string.IsNullOrEmpty(sex))
                {
                    qable = qable.Where(it => it.sex == sex);
                }
                if (!string.IsNullOrEmpty(orderFileds))//无需担心注入
                {
                    qable = qable.OrderBy(orderFileds);
                }
                return qable.ToPageList(pageIndex,pageSize);//ToPageList执行数据库并且反回结果集
            }
        }

        新容器转换

        public List<classNew> GetSelectList(int id)
        {
            using (SugarDao db = new SugarDao())
            {
                return db.Queryable<Student>().Where(c=>c.id<10).Select(c => new classNew { newid = c.id, newname = c.name,xx_name=c.name }).ToList();//不支持匿名类转换,也不建议使用
            }
        }

分组查询

 public List<SexTotal> GetSexTotal()
        {
            using (SugarDao db = new SugarDao())
            {
                return db.Queryable<Student>().Where(c => c.id < 20).GroupBy("sex").Select<Student, SexTotal>("Sex,Count=count(*)").ToList();
            }
        }
SELECT Sex,Count=count(*)  FROM Student  WHERE 1=1  AND  (id < 20)    GROUP BY Sex --生成结果

  

  

 3、多表查询:

说到多表查询在众多ORM中无论是性能还是功能上都不满意,或者说还不如用SQL,下面是我的创意,放弃了强类型写法,让代码更接近SQL语句编写,让SQL完全可控,也解决了OMR多表的性能问题。

还有ORDERBY、GROUPBY和APPLY等,例子中就不介绍了。

拿EF来比较一下:

EF查询:

 var reval = (from s in db.Student
                                join sc in db.School on s.sch_id equals sc.id
                                join sb in db.Subject on s.id equals sb.sid
                                into ssb
                                from sb2 in ssb.DefaultIfEmpty()
                                select new {
                                s.id,
                                s.name,
                                s.sch_id,
                                s.sex
                                }).Where(c=>c.id>1).Where(c=>c.id>2).OrderBy(c=>c.id).ThenByDescending(c=>c.name).Skip(10).Take(10).ToList();

SqlSugar查询:

      db.Sqlable().Form("Student", "s")
                        .Join("School", "sc", "sc.id", "s.sch_id", JoinType.INNER)
                        .Join("subject", "sb", "sb.sid", "s.id", JoinType.LEFT).Where("s.id>@id1").Where("s.id>@id2")
                        .SelectToPageList<Models.Student>("s.*", "s.id asc,s.name desc", 2, 10, new { id1=1,id2=2 });

更多的SqlSugar查询:

                    //多表查询
                    List<School> dataList = db.Sqlable()
                       .Form("school", "s")
                       .Join("student", "st", "st.id", "s.id", JoinType.INNER)
                       .Join("student", "st2", "st2.id", "st.id", JoinType.LEFT).Where("s.id>100 and s.id<@id").SelectToList<School>("st.*", new { id = 1 });

                    //多表分页
                    List<School> dataPageList = db.Sqlable()
                        .Form("school", "s")
                        .Join("student", "st", "st.id", "s.id", JoinType.INNER)
                        .Join("student", "st2", "st2.id", "st.id", JoinType.LEFT).Where("s.id>100 and s.id<100").SelectToPageList<School>("st.*", "s.id", 1, 10);

  

4、 使用SQL或者存储过程查询:

为了兼容上面满足不了的情况所以也写了这么个函数以便应急之需

                    var School = db.SqlQuery<School>("select * from School");

                    //获取id
                    var id = db.SqlQuery<int>("select top 1 id from School").Single();

                    //存储过程
                    //var spResult = db.SqlQuery<school>("exec sp_school @p1,@p2", new { p1=1,p2=2 });

  

添加

  

        using (SqlSugarClient db = new SqlSugarClient(connStr))//开启数据库连接
        {

                    School s = new School()
                    {
                        name = "蓝翔"
                    };

                    //插入单条
                    var id2 = Convert.ToInt32(db.Insert(s));

                    //插入多条
                    List<School> sList = new List<School>();
                    sList.Add(s);
                    var ids = db.InsertRange(sList);
         }

  

修改

                    //指定列更新
                    db.Update<School>(new { name = "蓝翔2" }, it => it.id == id);
                    //整个实体更新,注意主键必需为实体类的第一个属性
                    db.Update<School>(new School { id = id, name = "蓝翔2" }, it => it.id == id);

  

删除

                    db.Delete<School>(id);//注意主键必需为实体类的第一个属性
                    db.Delete<School>(it => it.id > 100);
                    db.Delete<School>(new string[] { "100", "101", "102" });

                     db.FalseDelete<school>("is_del", 100);//假删除
                     //等同于 update school set is_del=0 where id in(100)
                     db.FalseDelete<school>("is_del", it=>it.id==100);

更多底层函数

  

                   db.ExecuteCommand(sql);

                    db.GetDataTable(sql);
                    db.GetList<Student>(sql);
                    db.GetSingle<Student>(sql + " where id=1");
                    using (SqlDataReader read = db.GetReader(sql)) { }  //事务中一定要释放DataReader

                    db.GetScalar(sql);
                    db.GetString(sql);
                    db.GetInt(sql);

  

代码生成

 

 using (SqlSugarClient db = new SqlSugarClient(connStr))//开启数据库连接
 {

                  //根据当前数据库生成所有表的实体类文件 (参数:SqlSugarClient ,文件目录,命名空间)
                    db.ClassGenerating.CreateClassFiles(db,Server.MapPath("~/Models"),"Models");
                    //根据表名生成实体类文件
                    db.ClassGenerating.CreateClassFilesByTableNames(db, Server.MapPath("~/Models"), "Models" , "student","school");

                    //根据表名生成class字符串
                    var str = db.ClassGenerating.TableNameToClass(db, "Student");

                    //根据SQL语句生成class字符串
                    var str2 = db.ClassGenerating.SqlToClass(db, "select top 1 * from Student", "student");
}

  

事务

using (SqlSugarClient db = new SqlSugarClient(connStr))//开启数据库连接
{
   try{
       //开启事务,可以不使用事务,也可以使用多个事务
        db.BeginTran();

        //sq1
        //sql2
        //sql3 

    }catch (Exception ex){
       //回滚事务
       db.RollbackTran();
       throw ex;
    }

}//关闭数据库连接

无锁查询

  当IsNoLock设为True时,生成的SQL语句表名的后面都会带有With(Nolock)

using (SqlSugarClient db = new SqlSugarClient(connStr))//开启数据库连接
{
          db.Sqlable().IsNoLock = true;

          db.Sqlable().IsNoLock = false;

          db.Sqlable().IsNoLock = true;

}//关闭数据库连接

  

 

支持多库切换的写法

定义一个sugarDao类来扩展SqlSugar

  /// <summary>
    /// 扩展SqlSugarClient
    /// </summary>
    public class SugarDao
    {
        //禁止实例化
        private SugarDao() { 

        }
        public static SqlSugarClient GetInstance()
        {
            string connection = "Server=.;uid=sa;pwd=sasa;database=SqlSugarTest"; //这里可以动态根据cookies或session实现多库切换
            return new SqlSugarClient(connection);
        }
    }

  

使用无需传入connectionString

      public School GetSingleSchool(int id)
        {
            using (SqlSugarClient db = SugarDao.GetInstance())
            {
                return db.Queryable<School>().Single(c => c.id == id);
            }
        }

  

 

三、性能测试:

             10000次

1000次

10000次

.net4.52+EF 6.0+SQL12  以洗耻辱  

.NET Framework 4.52+ sql12 +EF6.0 ,EF性能明显上去了,就让它当个冠军吧,我也不去测试了,微软的东西升级后性能无需质疑,在多表查询和添删改方面综合下来也基本平手。

SqlSugar追求的是轻量、上手快、简单易用对SQL的可控性,也希望你能喜欢或者提出您宝贵意见。

V1.0源码下载地址:

http://pan.baidu.com/s/1i3EPdPj

时间: 2024-08-09 10:34:31

轻量级、高性能SQL ORM 之 SqlSugar - ASP.NET的相关文章

PetaPoco - 轻量级高性能的ORM框架(支持.NET Core)

我们都知道ORM全称叫做Object Relationship Mapper,也就是可以用object来map我们的db. 而且市面上的orm框架有很多,有重量级的Entity Framework,有轻量级的Dapper.PetaPoco等 假如你喜欢原生的Sql语句.又喜欢ORM的简单.又追求高性能,那么轻量级的ORM框架是你的不二选择. 说到轻量级ORM框架Dapper的名气比较大(因为出自名门?),但我却选择使用PetaPoco,因为: 提供了更易用的API Dapper仅提供了一系列Qu

开源ORM框架 SqlSugar 3.0的巨大变化

SqlSugar从1.0版本一直更新到3.0 ,使用该 ORM的人也越来越多,需求也越来越多,提出的需求和大家给我的建议的也都尽力满足. 并且 重构了EMIT和拉姆达解析,添加了无数的新功能,重新整了的GIT HUB上的DEMO,重新整理了所有注释. 完全基于SqlSugar的开源CMS http://www.baisoft.org/ 作者已经完成了后台并且将会开源. SqlSugar 3.0 即将发布 现在版本 2.99 优点: SqlSugar 是一款小巧,并且功能齐全的ORM,并不需要像D

基于轻量级高性能的CSS3动画库

简要教程 Repaintless.css是一款轻量级高性能的CSS3动画库.Repaintless.css通过特殊的方法来制作元素动画,不会引起页面的重绘,使它比其它CSS动画库具有更高的性能. 安装 你可以通过bower或npm来安装Repaintless.css. 1 $ bower install repaintless 2 $ npm install repaintless 使用方法 使用该CSS3动画库需要在页面中引入repaintless.css文件. 1 <link href=&quo

轻量级高性能 RPC 框架 HRPC

HRPC HRPC是一款基于Netty和Zookeeper设计的轻量级高性能RPC框架. 特性 采用Protostuff序列化:高性能,负载均衡:支持服务的注册和订阅:支持同步及异步2种调用方式:长连接,自动重连:采用cglib动态代理:代码简答,易上手:支持Spring: 更多轻量级高性能 RPC 框架 HRPC介绍

《高性能SQL调优精要与案例解析》一书谈主流关系库SQL调优(SQL TUNING或SQL优化)核心机制之——索引(index)

继<高性能SQL调优精要与案例解析>一书谈SQL调优(SQL TUNING或SQL优化),我们今天就谈谈各主流关系库中,占据SQL调优技术和工作半壁江山的.最重要的核心机制之一——索引(index).我们知道,<高性能SQL调优精要与案例解析>一书中也再三强调索引对SQL调优的重要性,可是上篇文章中也谈到,只看案例和解决问题的具体方法,而不掌握SQL调优的基础知识,是没有用的,我们必须做到知其然,更要知其所以然,才能做到融会贯通,活学活用,进而将SQL调优技术掌握到炉火纯青的地步.

Asp.Net 高性能ORM框架 SqlSugar.ORM 2.4.1

1.前言/Preface SqlSugar从去年到现在已经一年了,版本从1.0升到了现在的2.4.1 ,这是一个稳定版本 ,有数家公司已经项目上线,在这里我将SqlSugar的功能重新整理成一篇新的贴子,希望大家喜欢. 公司团队项目.产品已经完全抛弃EF,SqlSugar定位不是ORM,而是为了方便的让你去写Sql. 媲美原生ADO.NET的性能.简洁的语法和支持Json .Dynamic. List<T>. List<string[]>. ValueType和 Dictionar

Asp.Net 高性能ORM框架——SqlSugar

公司团队项目.产品已经完全抛弃EF,SqlSugar定位不是ORM,而是为了方便的让你去写Sql. SqlSugar 媲美原生ADO.NET的性能,语法简洁,并且支持 Json .Dynamic. List<T>. List<string[]>. ValueType和 Dictionary 等多种类型的返回值,有很多亮点. SqlSugar 功能介绍:  查询/Search 1.Queryable 用于拉姆达表达式操作(不久将支持Join多表) / Select single ta

Asp.net 高性能 Sqlite ORM 框架之 sqliteSugar

一.介简 easyliter框架的升级版本,并且正式命名为SqliteSugar框架,另外Sugar系列还有 MySql和MsSql版本,Oracle版本待开发中(因为客户端太大一直在忧郁当中) 用Sqlite 也不址什么高性能了,好用为主. 经过一天的努力,Sqlite 版本所有的例子都已经测试通过:  Sqlite .net4.0+ https://github.com/sunkaixuan/SqliteSugar MySql .NET 4.0+ https://github.com/sun

【原创】基于.NET的轻量级高性能 ORM - TZM.XFramework 之让代码更优雅

[前言] 大家好,我是TANZAME.出乎意料的,我们在立冬的前一天又见面了,天气慢慢转凉,朋友们注意添衣保暖,愉快撸码.距离 TZM.XFramework 的首秀已数月有余,期间收到不少朋友的鼓励.建议和反馈,在此致以深深的感谢. 不少围观的朋友经常问题我,.NET 体系下优秀的 O/RM 官方的有EF,第三方的有linq2db (国外).StackExchange/Dapper (国外).NHibernate (国外).PetaPoco (国外).Freesql (国内)等等,What's