.NET ORM框架 SqlSugar4.0 功能快速預覽【開源】

SqlSugar 4.0 ORM框架的優點

爲了將來可以更好的支持多庫分佈式的存儲,並行計算等功能,將SqlSugar3.x所有重寫,現有的架構能夠輕鬆擴展多庫。git

 

源碼下載:github

https://github.com/sunkaixuan/SqlSugar數據庫

 

1.性能

性能最好的ORM之一,具備超越Dapper的性能 ,走的是EMIT夠構中間語言動態編譯到程序集,完成高性能的實體綁定,達到原生水平。架構

測試方式用Realease模式,Realease DLL 進行的車輪戰app

 

2.功能

除了EF之外能夠說的是功能最大的ORM框架框架

支持 DbFirst、CodeFirst、數據庫維護、鏈式查詢、鏈式更新、鏈式刪除、鏈式插入、實體屬性、複雜模型的查詢、ADO.NET。特別是批量等功能都是貨真價實的並不是循環操做。分佈式

SqlSugar 4.0版本 6月底支持SqlSever的Core版 ,預計7月份支持多庫,8月分開始分佈式ORM的開發。 (3.x版本已經支持了4種數據庫,相對穩定功能簡單)ide

 

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("Student").CreateClassFile("c:\\Demo\\5");
db.DbFirst.CreateClassFile(true,"Student","c:\\Demo\\5");

第三鏈式操更具備擴展性  例若有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查詢

//Id In (1,2,3)
var in1 = db.Queryable<Student>().In(it=>it.Id,new int[] { 1, 2, 3 }).ToList();

//主鍵 In (1,2,3)
var in2 = db.Queryable<Student>().In(new int[] { 1, 2, 3 }).ToList();

//Id In (1,2)
int[] 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();

多條件查詢

var getByWhere = db.Queryable<Student>().Where(it => it.Id == 1 || it.Name == "a").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 取新的表名

var getListByRename = db.Queryable<School>().AS("Student").ToList();

排序

var getAllOrder = db.Queryable<Student>()
.OrderBy(it => it.Id)//asc
.OrderBy(it => it.Name, OrderByType.Desc)//desc
.ToList()

是否存在這條記錄

var isAny = db.Queryable<Student>().Where(it => it.Id == -1).Any();
var isAny2 = db.Queryable<Student>().Any(it => it.Id == -1);

獲取同一天的記錄

var getTodayList = db.Queryable<Student>().Where(it => SqlFunc.DateIsSame(it.CreateTime, DateTime.Now)).ToList();

 

多表查詢

//LEFT JOIN 
var list = db.Queryable<Student, School>((st, sc) => new object[] {
JoinType.Left,st.SchoolId==sc.Id
})
.Where(st => st.Name == "jack").ToList();

//三表 LEFT JOIN
var list2 = db.Queryable<Student, School, Student>((st, sc, st2) => new object[] {
JoinType.Left,st.SchoolId==sc.Id,
JoinType.Left,st.SchoolId==st2.Id
})
.Where((st, sc, st2) => st2.Id == 1 || sc.Id == 1 || st.Id == 1).ToList();

//返回 List<ViewModelStudent>
var list3 = db.Queryable<Student, School>((st, sc) => new object[] {
JoinType.Left,st.SchoolId==sc.Id
}).Select((st, sc) => new ViewModelStudent { Name = st.Name, SchoolId = sc.Id }).ToList();

//join Order By (order by st.id desc,sc.id desc)
var list4 = db.Queryable<Student, School>((st, sc) => new object[] {
JoinType.Left,st.SchoolId==sc.Id
})
.OrderBy(st => st.Id, OrderByType.Desc)
.OrderBy((st, sc) => sc.Id, OrderByType.Desc)
.Select((st, sc) => new ViewModelStudent { Name = st.Name, SchoolId = sc.Id }).ToList();

 

多表查詢簡化,與JOIN的方式高低搭配,若是不須要LEFT JOIN能夠簡寫成下面的語句

var list5 = db.Queryable<Student, School>((st, sc) => st.SchoolId == sc.Id)
.Select((st,sc)=>new {st.Name,st.Id,schoolName=sc.Name}).ToList();

//三表查詢
var list6 = 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,schoolName2=sc2.Name }).ToList();
//三表查詢分頁 var list8 = db.Queryable<Student, School, School>((st, sc, sc2) => st.SchoolId == sc.Id && sc.Id == sc2.Id) .OrderBy(st=>st.Id) .Select((st, sc, sc2) => new { st.Name, st.Id, schoolName = sc.Name, schoolName2 = sc2.Name }).ToPageList(1, 2);

 

 

分組查詢

var group = db.Queryable<Student>().GroupBy(it => it.Id)
    .Having(it => SqlFunc.AggregateCount(it.Id) > 10)
    .Select(it => new { id = SqlFunc.AggregateCount(it.Id) }).ToList();

根據字段分組取第一條,這個很是的好用

var list3 = db.Queryable<Student>()
.PartitionBy(it => new { it.Id, it.Name }).Take(1).ToList();

 

實體轉換支持2級模型

var s5 = db.Queryable<Student>().Select(it => new ViewModelStudent { Student = it, Name = it.Name }).ToList();
 
//實體結構  
public class ViewModelStudent {
  public Student Student{get;set;}
  pulic string Name{get;set;}
}

 

若是你是字段串拼接愛好者你也能夠這樣與拉姆達混用,或者純拼SQL

var join3 = db.Queryable("Student", "st")
        .AddJoinInfo("School", "sh", "sh.id=st.schoolid")
        .Where("st.id>@id")
        .AddParameters(new { id = 1 })
        .Select("st.*").ToList();

支持的原生函數 

.ToString

.Contains 

.Length

.ToLower

.ToUpper

.ToSubstring 

.Equals

.HasValue

.Replace

.EndsWith

.StartsWith

.Trim

 

支持的自定義函數


三元判段 ,至關於 it.id==1?1:2

SqlFunc.IIF(it.Id == 1, 1, 2)

判段是NULL或者空

SqlFunc.IsNullOrEmpty(object thisValue)

判段不是NULL而且不是空

SqlFunc.HasValue(object thisValue)

判段大於0而且不等於NULL

SqlFunc.HasNumber(object thisValue)

轉小寫

SqlFunc.ToLower(object thisValue)

轉大寫

SqlFunc.ToUpper(object thisValue)

去先後空格

SqlFunc.Trim(object thisValue)


模糊查詢 like %@p%

SqlFunc.Contains(string thisValue, string parameterValue)

也可使用 .Where(it=>it.Name.Contains("a"));


In操做 thisValue={1,2,3} 生成的Sql就是 paramterValie in (1,2,3)

SqlFunc.ContainsArray(object[] thisValue, string parameterValue)

也可使用 .Where(it=>Array.Contains(it.Id));
Not In 操做
.Where(it=>!Array.Contains(it.Id));


模糊查詢 like @p%

SqlFunc.StartsWith(object thisValue, string parameterValue

模糊查詢 like %@p

SqlFunc.EndsWith(object thisValue, string parameterValue)

等於

SqlFunc.Equals(object thisValue, object parameterValue)

是不是同一天

SqlFunc.DateIsSame(DateTime date1, DateTime date2)

是不是同一時間 (dataType 能夠是年、月、天、小時、分鐘、秒和毫秒)

SqlFunc.DateIsSame(DateTime date1, DateTime date2, DateType dataType)

在當前時間加必定時間(dataType 能夠是年、月、天、小時、分鐘、秒和毫秒)

SqlFunc.DateAdd(DateTime date, int addValue, DateType dataType)

在當前時間加N天

SqlFunc.DateAdd(DateTime date, int addValue)

獲取當前時間的年、月、天、小時、分鐘、秒或者毫秒

SqlFunc.DateValue(DateTime date, DateType dataType)

範圍判段

SqlFunc.Between(object value, object start, object end)

類型轉換

SqlFunc.ToInt32(object value) 
SqlFunc.ToInt64(object value)
SqlFunc.ToDate(object value) 
SqlFunc.ToString(object value) 
SqlFunc.ToDecimal(object value) 
SqlFunc.ToGuid(object value) 
SqlFunc.ToDouble(object value) 
SqlFunc.ToBool(object value)

截取字符串

SqlFunc.Substring(object value, int index, int length)

替換字符串

SqlFunc.Replace(object value, string oldChar, string newChar)

獲取字符串長度

SqlFunc.Length(object value) { throw new NotImplementedException(); }

聚合函數

SqlFunc.AggregateSum<TResult>(TResult thisValue) 
SqlFunc.AggregateAvg<TResult>(TResult thisValue)
SqlFunc.AggregateMin(TResult thisValue) 
SqlFunc.AggregateMax<TResult>(TResult thisValue) 
SqlFunc.AggregateCount<TResult>(TResult thisValue)

若是還有不支持的能夠寫字符串

db.Queryable<Student>().Where("xxx(xx)")

 

2.Updateable

updateable主要功能有批量更新、單條更新、指定更新列、排除更新列、根據拉姆達更新、根據實體更新等操做

根據實體更新(主鍵要有值,主鍵是更新條件)

var t1 = db.Updateable(updateObj).ExecuteCommand();

只更新實體裏面的Name列(主鍵要有值,主鍵是更新條件)

var t3 = db.Updateable(updateObj).UpdateColumns(it => new { it.Name }).ExecuteCommand();

更新 Name和 TestId 之外的全部列 (主鍵要有值,主鍵是更新條件)

var t4 = db.Updateable(updateObj)
.IgnoreColumns(it => new { it.Name, it.TestId }).ExecuteCommand();

更新NAME

var t5 = db.Updateable(updateObj)
.IgnoreColumns(it => it=="name" ).With(SqlWith.UpdLock).ExecuteCommand();

使用鎖

var t6 = db.Updateable(updateObj).With(SqlWith.UpdLock).ExecuteCommand();

批量更新(主鍵要有值,主鍵是更新條件)

List<Students> list=GetList();
var t7 = db.Updateable(list).ExecuteCommand();

實體更新,而且給指定列從新賦值

var t8 = db.Updateable(updateObj)
.ReSetValue(it => it.Name == (it.Name + 1)).ExecuteCommand();

更新實體,更新條件是根據表達示

var t9 = db.Updateable(updateObj).Where(it => it.Id == 1).ExecuteCommand();

根據表達式中的列更新 ,指定列並賦值的更新,比較經常使用

var t10 = db.Updateable<Student>()
.UpdateColumns(it => new Student() { Name = "a", CreateTime = DateTime.Now })
.Where(it => it.Id == 11).ExecuteCommand();

 

別名表

db.Updateable<School>().AS("Student")
.UpdateColumns(it => new School() { Name = "jack" })
.Where(it => it.Id == 1).ExecuteCommand();
//Update Student set Name='jack' Where Id=1

是NULL的列不更新
db.Updateable(updateObj).Where(true).ExecuteCommand();

 

3.Insertable

Insertable主要功能有 批量插入、單條插入、指定插入列、排除插入列等功能

插入並返回受影響行數用ExecuteCommand

var t2 = db.Insertable(insertObj).ExecuteCommand();

插入並返回自增列用ExecuteReutrnIdentity

var t3 = db.Insertable(insertObj).ExecuteReutrnIdentity();

只插入列 Name和SchoolId

var t4 = db.Insertable(insertObj).InsertColumns(it => new { it.Name, it.SchoolId }).ExecuteReutrnIdentity();

不插入列 Name和TestId

var t5 = db.Insertable(insertObj).IgnoreColumns(it => new { it.Name, it.TestId }).ExecuteReutrnIdentity();

根據條件指定不插入列

var t6 = db.Insertable(insertObj).IgnoreColumns(it => it == "Name" || it == "TestId").ExecuteReutrnIdentity();

使用鎖

var t8 = db.Insertable(insertObj).With(SqlWith.UpdLock).ExecuteCommand();

能夠設置NULL列不插入和是否強制插入自增列

var t9 = db.Insertable(insertObj2)
.Where(true/* Is no insert null */, true/*off identity*/)
.ExecuteCommand();

批量插入

var insertObjs = new List<Student>();
var s9 = db.Insertable(insertObjs.ToArray()).ExecuteCommand();

 

Deleteable

根據主鍵刪除、單條刪除、條件刪除、表達式刪除等功能

根據實體刪除(實體內主鍵必定要有值)

var t0 = db.Deleteable<Student>().Where(new Student() { Id = 1 }).ExecuteCommand();

根據實體集刪除

var t1 = db.Deleteable<Student>().Where(new List<Student>() { new Student() { Id = 1 } }).ExecuteCommand();

使用鎖

var t2 = db.Deleteable<Student>().With(SqlWith.RowLock).ExecuteCommand();

根據主鍵刪除

var t3 = db.Deleteable<Student>().In(1).ExecuteCommand();

根據主鍵批量刪除

var t4 = db.Deleteable<Student>().In(new int[] { 1, 2 }).ExecuteCommand();

根據表達式刪除

var t5 = db.Deleteable<Student>().Where(it => it.Id == 1).ExecuteCommand();

 

其它功能的一些簡介

由於功能太多九大功能只講了4大功能的用法,其它功能我就簡單描述一下

DbFirst:用於建立實體、支持模型自定義、能夠生成所有表的實體、也能夠指定表和支持生成屬性和默認值

CodeFirst:支持經過類生成實體、主鍵、自增列、支持表的備份和字段名稱的修改

Ado.Net: 支持SqlQuery<T> 一系列 原生SQL操做 支持事務、存儲過程輸出參數等功能

DbMaintenance:數據庫的維護操做 支持表備份、庫備份、添加表、添加列、獲取表信息 、根據表獲取主鍵等相關數據庫層面的操做

EntityProvider:獲取實體類的相關信息

 

另外支持了複雜模型的用法:

  var students = db.Queryable<CMStudent>().ToList();
  if (students != null)
  {
       foreach (var item in students)
       {
            Console.WriteLine(item.SchoolName);
 
            Console.WriteLine(item.SchoolSingle.Name);
             
            Console.WriteLine(item.SchoolList.Count);
    }
  }

 

源碼下載:

https://github.com/sunkaixuan/SqlSugar

相關文章
相關標籤/搜索