最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
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 ListGetSelectList(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 ListGetSexTotal() { 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查询:
//表名是字符串写法 ListdataList = 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 ListGetStudent(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)); //插入多条 ListsList = 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{ css" rel="stylesheet" type="text/css" /> @Html.Raw(Model) }@Html.Raw(ViewBag.validationBind)
本例子是是最基本的增、删、查、改。
功能虽然简单但是也考虑到了很多问题比如: 前端加后端的双向验证、代码扩展性强、语法简洁、异常的处理等。
相关文章
- C#复制数组的两种方式及效率比较解读 10-24
- ASP.NET Identity用法解析 10-24
- ASP.NET MVC使用Identity增删改查用户介绍 10-24
- C语言中atoi函数模拟实现介绍 10-18
- .Net反向代理组件Yarp用法介绍 10-10
- .NET使用YARP通过编码方式配置域名转发实现反向代理教程 10-10