一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

ASP.NET用SqlSugar+SyntacticSugar+JQWidgetsSugar+jqwidgets框架MVC快速开发实例教程

时间:2015-08-04 编辑:简简单单 来源:一聚教程网

jqwidgets.js:

是一个功能完整的框架,它具有专业的可触摸的jQuery插件、主题、输入验证、拖放插件、数据适配器,内置WAI-ARIA(无障碍网页应用)可访问性、国际化和MVVM模式支持。jQWidgets 为搭建专业网站和开发移动应用程序提供了一个全面的解决方案。它完全基于开放的标准和技术,如 HTML5、CSS、Javascript和jQuery。jQWidgets能实现响应式web开发,可以帮助您创建在桌面、平板电脑和智能手机上看起来很漂亮的应用程序和网站。

无论是美感还是功能都比easyui更胜一筹,代码开源使用收费。

 
SyntacticSugar.dll:

功能齐全包含验证、通用扩展函数、类型转换、文件上传、以及大量C#语法糖的一款工具类库。

源码地址:https://github.com/sunkaixuan/SyntacticSugar

 
SqlSugar.dll:

是一款基于MSSQL的轻量级、高性能、简单易用的ORM框架

一、介简

优点:

1、优越的性能,查询使用  reflection.emit 创建IL语言+委托绑定 然后对该对象进行 cache ,datareader直接赋值给cache对象,高性能拉姆达解析,总体性能媲美 ADO.NET ,查询速度稍慢于datareader但稍快于datatable
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().ToList();
      //查询单条
      var single = db.Queryable().Single(c => c.id == 1);
      //取10-20条
      var page1 = db.Queryable().Where(c => c.id > 10).OrderBy("id").Skip(10).Take(20).ToList();
      //上一句的简化写法,同样取10-20条
      var page2 = db.Queryable().Where(c => c.id > 10).OrderBy("id").ToPageList(2, 10);
      //查询条数
      var count = db.Queryable().Where(c => c.id > 10).Count();
      //从第2条开始以后取所有
      var skip = db.Queryable().Where(c => c.id > 10).OrderBy("id").Skip(2).ToList();
      //取前2条
      var take = db.Queryable().Where(c => c.id > 10).OrderBy("id").Take(2).ToList();
      // Not like
      var notLike = db.Queryable().Where(c => !c.name.Contains("a".ToString())).ToList();
      // 可以在拉姆达使用 ToString和 Convert,比EF出色的地方
      var convert1 = db.Queryable().Where(c => c.name == "a".ToString()).ToList();
      var convert2 = db.Queryable().Where(c => c.id == Convert.ToInt32("1")).ToList();//
      var convert3 = db.Queryable().Where(c => DateTime.Now > Convert.ToDateTime("2015-1-1")).ToList();
      var convert4 = db.Queryable().Where(c => DateTime.Now > DateTime.Now).ToList();
      //支持字符串Where 让你解决,更复杂的查询
      var student12 = db.Queryable().Where(c => 1 == 1).Where("id>@id",new{id=1}).ToList();
}
//存在记录反回true,则否返回false
 bool isAny100 = db.Queryable().Any(c => c.id == 100);
 bool isAny1 = db.Queryable().Any(c => c.id == 1);


2、单表高级查询

根据条件查询并分页 

/// 
/// 根据条件查询并且分页
/// 
/// 
/// 
/// 
public static List GetStudent(string name, string sex, int pageIndex, int pageSize, string orderFileds,out int pageCount)
{
  using (SqlSugarClient db = SugarDao.GetInstance())
  {
      var qable = db.Queryable();
      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);
      }
      pageCount = qable.Count();
      return qable.ToPageList(pageIndex, pageSize);
  }
}


新容器转换

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


分组查询

public List GetSexTotal()
{
   using (SugarDao db = new SugarDao())
   {
       return db.Queryable().Where(c => c.id < 20).GroupBy("sex").Select("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("s")
  .Join ("sc", "sc.id", "s.sch_id", JoinType.INNER)
  .Join("sb", "sb.sid", "s.id", JoinType.LEFT).Where("s.id>@id1").Where("s.id>@id2")
  .SelectToPageList("s.*", "s.id asc,s.name desc", 2, 10, new { id1=1,id2=2 });


更多的SqlSugar查询:

//表名是字符串写法
List 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("st.*", new { id = 1 });
 
//多表分页
List dataPageList = db.Sqlable()
    .Form("s")
    .Join("st", "st.id", "s.id", JoinType.INNER)
    .Join("st2", "st2.id", "st.id", JoinType.LEFT).Where("s.id>100 and s.id<100").SelectToPageList("st.*", "s.id", 1, 10);


子查询加动态拼接

public List GetStudent(int id, string name)
{
   int pageCount = 0;
   using (var db = SugarDao.GetInstance())
   {
       //Form("Student","s")语法优化成 Form("s")
       var sable = db.Sqlable().Form("s").Join("l", "s.sch_id", "l.id", JoinType.INNER);
       if (!string.IsNullOrEmpty(name))
       {
           sable = sable.Where("s.name=@name");
       }
       if (!string.IsNullOrEmpty(name))
       {
           sable = sable.Where("s.id=@id or s.id=100");
       }
       if (id > 0) {
           sable = sable.Where("l.id in (select top 10 id from school)");//where加子查询
       }
       //参数
       var pars = new { id = id, name = name };
       pageCount = sable.Count(pars);
       return sable.SelectToList("s.*", pars);
   }
}

 

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

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

var School = db.SqlQuery("select * from School");
 
//获取id
var id = db.SqlQuery("select top 1 id from School").Single();
 
//存储过程
//var spResult = db.SqlQuery("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 sList = new List();
            sList.Add(s);
            var ids = db.InsertRange(sList);
 }


  
修改

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


 
删除

db.Delete(id);//注意主键必需为实体类的第一个属性
db.Delete(it => it.id > 100);
db.Delete(new string[] { "100", "101", "102" });
   
 db.FalseDelete("is_del", 100);//假删除
 //等同于 update school set is_del=0 where id in(100)
 db.FalseDelete("is_del", it=>it.id==100);


 
更多底层函数

db.ExecuteCommand(sql);
 
 db.GetDataTable(sql);
 db.GetList(sql);
 db.GetSingle(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.IsNoLock = true;
          //sql xxx with(nolock)
          db.IsNoLock = false;
          //sql xxx
          //sql xxx
          db.IsNoLock = true;
          //sql xxx with(nolock)
 
}//关闭数据库连接


支持多库切换的写法
 

定义一个sugarDao类来扩展SqlSugar

/// 
/// 扩展SqlSugarClient
/// 
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().Single(c => c.id == id);
      }
  }


 
三、性能测试:

10000次


1000次


10000次



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

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


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



JQWidgetsSugar.dll

基于jqwidgets.js 的C#封装类库 ,目前只完成了grid部分 ,我的所有GIT项目会在以后项目开发中持续更新


效果图:

 

C#代码
    

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using SqlSugar;
using DAL;
using JQWidgetsSugar;
using Models;
using SyntacticSugar;
namespace NetJQWidgets.Controllers
{
    public class GridController : Controller
    {
        public ActionResult Index()
        {
            var adp = new GridDataAdapterSource();
            adp.url = "/Grid/Data";
            var gc = new GridConfig();
            gc.gridbuttons = new List()
            {
               new GridButton(){ click="add", name="addbutton", icon="jqx-icon-plus", title="添加"},
               new GridButton(){ click="edit", name="editbutton", icon="jqx-icon-edit", title="编辑"},
               new GridButton(){ click="del", name="delbutton", icon="jqx-icon-delete", title="删除"}
            };
            gc.pageSize = 20;
            gc.width = "80%";
            gc.columns = new List(){
               new GridColumn(){ text="编号", datafield="id", , cellsalign=AlignType.left,datatype=Datatype.dataint  },
               new GridColumn(){ text="名称", datafield="name", cellsalign=AlignType.left,datatype=Datatype.datastring },
               new GridColumn(){ text="产品名", datafield="productname", cellsalign=AlignType.left,datatype=Datatype.datastring },
               new GridColumn(){ text="数量", datafield="quantity", cellsalign=AlignType.right , datatype=Datatype.dataint },
               new GridColumn(){ text="创建时间", datafield="date", cellsformat="yyyy-MM-dd",cellsalign=AlignType.right, datatype=Datatype.datadate
              }
            };
        
            var grid = JQXGrid.BindGrid("#netgrid", adp, gc);
            ViewBag.validationBind = ValidationSugar.GetBindScript("validate_key_grid_index");
            return View(grid);
        }
 
        [HttpDelete]
        public JsonResult Del(int id)
        {
            using (SqlSugarClient db = SugarDao.GetInstance())
            {
                ActionResultModel model = new ActionResultModel();
                model.isSuccess = db.Delete(id);
                model.respnseInfo = model.isSuccess ? "删除成功" : "删除失败";
                return Json(model);
            }
        }
 
        [HttpPost]
        public JsonResult Add(GridTable gt)
        {
            using (SqlSugarClient db = SugarDao.GetInstance())
            {
                string message = string.Empty;
                var isValid = ValidationSugar.PostValidation("validate_key_grid_index", out message);
                ActionResultModel model = new ActionResultModel();
                if (isValid)//后台验证数据完整性
                {
                    model.isSuccess = db.Insert(gt) != DBNull.Value;
                    model.respnseInfo = model.isSuccess ? "添加成功" : "添加失败";
                }
                else {
                    model.isSuccess = false;
                    model.respnseInfo = message;
                }
                return Json(model);
            }
        }
        [HttpPut]
        public JsonResult Edit(GridTable gt)
        {
            using (SqlSugarClient db = SugarDao.GetInstance())
            {
                ActionResultModel model = new ActionResultModel();
                string message = string.Empty;
                var isValid = ValidationSugar.PostValidation("validate_key_grid_index", out message);
                if (isValid)//后台验证数据完整性
                {
                    model.isSuccess = db.Update(gt, it => it.id == gt.id);
                    model.respnseInfo = model.isSuccess ? "编辑成功" : "编辑失败";
                }
                else {
                    model.isSuccess = false;
                    model.respnseInfo = message;
                }
                return Json(model);
            }
        }
 
        [OutputCache(Duration = 0)]
        public JsonResult Data(GridSearchParams pars)
        {
            using (SqlSugarClient db = SugarDao.GetInstance())
            {
                if (pars.sortdatafield == null) { //默认按id降序
                    pars.sortdatafield = "id";
                    pars.sortorder = "desc";
                }
                Sqlable sable = db.Sqlable().Form("g");//查询表的sqlable对象
                var model = JQXGrid.GetWidgetsSource(sable, pars);//根据grid的参数自动查询
                return Json(model, JsonRequestBehavior.AllowGet);
            }
        }
    }
}



Razor视图

@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
@using JQWidgetsSugar
@section head{
    javascript">
    css" rel="stylesheet"
        type="text/css" />
    
    
    
    
 
        //添加
        function add(row) {
            save(row, true);
        }
 
        //编辑
        function edit(row) {
            save(row, false);
        }
 
        //删除
        function del(row) {
            if (row == null) {
                jqxAlert('请选择一条记录!')
            } else {
                jqxDelete({ gridSelector: "#netgrid",
                    url: "/Grid/Del",
                    data: { id: row.id }
                });
            }
        }
 
        function save(row, isAdd) {
            var isEdit = !isAdd;
            if (isEdit) {
                if (row == null) {
                    jqxAlert('请选择一条记录!')
                    return;
                }
            }
            //弹出框
            jqxWindow("#editbox", isAdd?"添加":"编辑", 400, "auto");
 
            //美化 button
            $("#editbox button").jqxButton();
 
            //取消事件
            $('#cancel').unbind();
            $('#cancel').on('click', function (e) {
                $("#editbox").jqxWindow("close")
            });
 
            if (isAdd) {
                //清空表单
                $("#frmtable").formClear();
            } else {
                //格日化日期
                row.date = $.convert.toDate(row.date, "yyyy-MM-dd")
                //通过JSON自动填充表单,也可以自已实现
                $("#frmtable").formFill({ data: row })
            }
            //确定事件
            $('#save').unbind();
            $('#save').on('click', function (e) {
                factory.ajaxSubmit(function () {
                    var url = isAdd ? "/grid/add" : "/grid/edit";
                    var type = isAdd ? "post" : "put";
                    $("#frmtable").ajaxSubmit({
                        url: url,
                        type: type,
                        success: function (msg) {
                            if (msg.isSuccess == false) {
                                jqxAlert(msg.respnseInfo);
                            }
                            $("#netgrid").jqxDataTable('updateBoundData');
                            $("#editbox").jqxWindow("close")
                        }, error: function (msg) {
                            console.log(msg);
                        }
                    })
                });
            });
 
        }
 
 
 
        //绑定验证
        $(function () {
            window.factory = new validateFactory($("form"), "");
            factory.init();
 
        });
    
    @Html.Raw(Model)
}

                                                                         名称:                                                                                                                                                             产品名:                                                                                                                                        数量:                                                                                                                                        时间:                                                                                                                                                                                                                        保存                                              取消                                                     
@Html.Raw(ViewBag.validationBind)


 
本例子是是最基本的增、删、查、改。

功能虽然简单但是也考虑到了很多问题比如: 前端加后端的双向验证、代码扩展性强、语法简洁、异常的处理等。

相关文章

热门栏目