English | 中文

## SqlSugar ORM SqlSugar is .NET open source ORM framework, maintained and updated by Fructose Big Data Technology team, the most easy-to-use ORM out of the box Advantages: [Low code] [High performance] [Super simple] [Comprehensive features] [ Multi-database compatible] [Suitable products] ## Support .NET .net framework.net core3.1.ne5.net6.net7.net8 .net9 .net10 ## Support database MySql、SqlServer、Sqlite、Oracle 、 postgresql、达梦、 人大金仓(国产推荐)、神通数据库、瀚高、Access 、OceanBase TDengine QuestDb Clickhouse MySqlConnector、华为 GaussDB 南大通用 GBase、MariaDB、Tidb、Odbc、Percona Server, Amazon Aurora、Azure Database for MySQL、 Google Cloud SQL for MySQL、custom database ## Description 1. Truly achieve zero SQL ORM table building, index and CRUD all support 2. Support.NET millions of big data write, update, subtable and has billions of query statistics mature solutions 3. Support SAAS complete application: cross-database query, audit, tenant sub-database, tenant sub-table and tenant data isolation 4. Support low code + workflow (dynamic class building, dynamic table building, non-entity multi-library compatible with CRUD, JSON TO SQL, custom XML, etc.) 5. Support ValueObject, discriminator, repository, UnitOfWork, DbContext, AOP ## Documentation |Other |Select | Insert | Update | Delete| | ----- | --------- | ----------- | ------- |------- | Nuget| Query | Insert |Update| Delete | Start guide | Join query |Insert without entity | Update without entity | Delete without entity | | |Multiple databases | Include query|Include Insert| Include Update| Include Delete |中文文档|Cross database query|Insert by json|Update by json|Delete by json| ## Feature characteristic ### Feature1 : Join query Super simple query syntax ```cs var query = db.Queryable() .LeftJoin ((o, cus) => o.CustomId == cus.Id) .LeftJoin ((o, cus, oritem ) => o.Id == oritem.OrderId) .LeftJoin ((o, cus, oritem , oritem2) => o.Id == oritem2.OrderId) .Where(o => o.Id == 1) .Select((o, cus) => new ViewOrder { Id = o.Id, CustomName = cus.Name }) .ToList(); ``` ```sql SELECT [o].[Id] AS [Id], [cus].[Name] AS [CustomName] FROM [Order] o Left JOIN [Custom] cus ON ([o].[CustomId] = [cus].[Id]) Left JOIN [OrderDetail] oritem ON ([o].[Id] = [oritem].[OrderId]) Left JOIN [OrderDetail] oritem2 ON ([o].[Id] = [oritem2].[OrderId]) WHERE ([o].[Id] = @Id0) ``` ### Feature2 :Include Query、Insert、Delete and Update ```cs //Includes var list=db.Queryable() .Includes(x => x.Provinces,x=>x.Citys ,x=>x.Street) //multi-level .Includes(x => x.ClassInfo) .ToList(); //Includes+left join var list5= db.Queryable() .Includes(x => x.school_001, x => x.rooms) .Includes(x => x.books) .LeftJoin((x, y) => x.Id==y.sid) .Select((x,y) => new Student_004DTO { SchoolId = x.SchoolId, books = x.books, school_001 = x.school_001, Name=y.Name }) .ToList(); ``` ### Feature3 : Page query ```cs int pageIndex = 1; int pageSize = 20; int totalCount=0; var page = db.Queryable().ToPageList(pageIndex, pageSize, ref totalCount); ``` ### Feature4 : Dynamic expression ```cs var names= new string [] { "a","b"}; Expressionable exp = new Expressionable(); foreach (var item in names) { exp.Or(it => it.Name.Contains(item.ToString())); } var list= db.Queryable().Where(exp.ToExpression()).ToList(); ``` ```sql SELECT [Id],[Name],[Price],[CreateTime],[CustomId] FROM [Order] WHERE ( ([Name] like '%'+ CAST(@MethodConst0 AS NVARCHAR(MAX))+'%') OR ([Name] like '%'+ CAST(@MethodConst1 AS NVARCHAR(MAX))+'%') ) ``` ### Feature5 : Multi-tenant transaction ```cs //Creaate database object SqlSugarClient db = new SqlSugarClient(new List() { new ConnectionConfig(){ ConfigId="0", DbType=DbType.SqlServer, ConnectionString=Config.ConnectionString, IsAutoCloseConnection=true }, new ConnectionConfig(){ ConfigId="1", DbType=DbType.MySql, ConnectionString=Config.ConnectionString4 ,IsAutoCloseConnection=true} }); var mysqldb = db.GetConnection("1");//mysql db var sqlServerdb = db.GetConnection("0");// sqlserver db db.BeginTran(); mysqldb.Insertable(new Order() { CreateTime = DateTime.Now, CustomId = 1, Name = "a", Price = 1 }).ExecuteCommand(); mysqldb.Queryable().ToList(); sqlServerdb.Queryable().ToList(); db.CommitTran(); ``` ### Feature6 : Singleton Pattern Implement transactions across methods ```CS public static SqlSugarScope Db = new SqlSugarScope(new ConnectionConfig() { DbType = SqlSugar.DbType.SqlServer, ConnectionString = Config.ConnectionString, IsAutoCloseConnection = true }, db=> { db.Aop.OnLogExecuting = (s, p) => { Console.WriteLine(s); }; }); using (var tran = Db.UseTran()) { new Test2().Insert(XX); new Test1().Insert(XX); ..... .... tran.CommitTran(); } ``` ### Feature7 : Query filter ```cs //set filter db.QueryFilter.Add(new TableFilterItem(it => it.Name.Contains("a"))); db.Queryable().ToList(); //SELECT [Id],[Name],[Price],[CreateTime],[CustomId] FROM [Order] WHERE ([Name] like '%'+@MethodConst0+'%') db.Queryable((i, o) => i.OrderId == o.Id) .Where(i => i.OrderId != 0) .Select("i.*").ToList(); //SELECT i.* FROM [OrderDetail] i ,[Order] o WHERE ( [i].[OrderId] = [o].[Id] ) AND //( [i].[OrderId] <> @OrderId0 ) AND ([o].[Name] like '%'+@MethodConst1+'%') ``` ### Feature8 : Insert or update insert or update ```cs Db.Storageable(list2).ExecuteCommand(); Db.Storageable(list2).PageSize(1000).ExecuteCommand(); Db.Storageable(list2).PageSize(1000,exrows=> { }).ExecuteCommand(); ``` ### Feature9 : Auto split table Split entity ```cs [SplitTable(SplitType.Year)]//Table by year (the table supports year, quarter, month, week and day) [SugarTable("SplitTestTable_{year}{month}{day}")] public class SplitTestTable { [SugarColumn(IsPrimaryKey =true)] public long Id { get; set; } public string Name { get; set; } //When the sub-table field is inserted, which table will be inserted according to this field. //When it is updated and deleted, it can also be convenient to use this field to //find out the related table [SplitField] public DateTime CreateTime { get; set; } } ``` Split query ```cs var lis2t = db.Queryable() .SplitTable(DateTime.Now.Date.AddYears(-1), DateTime.Now) .ToPageList(1,2);  ``` ### Feature10 : Big data insert or update ```cs 10.1 BulkCopy db.Fastest().BulkCopy(lstData);//insert db.Fastest().PageSize(100000).BulkCopy(insertObjs); db.Fastest().AS("order").BulkCopy(dataTable); 10.2 BulkUpdate db.Fastest().BulkUpdate(GetList())//update db.Fastest().PageSize(100000).BulkUpdate(GetList()) db.Fastest().BulkUpdate(GetList(),new string[] { "Id"});//no primary key db.Fastest().BulkUpdate(GetList(), new string[]{"id"}, new string[]{"name","time"})//Set the updated column //DataTable db.Fastest().AS("Order").BulkUpdate(dataTable,"Id");//Id is primary key db.Fastest().AS("Order").BulkUpdate(dataTable,"Id",Set the updated column); 10.3 BulkMerge (5.1.4.109) db.Fastest().BulkMerge(List); db.Fastest().PageSize(100000).BulkMerge(List); 10.4 BulkQuery db.Queryable().ToList();//Slightly faster than Dapper //Suitable for big data export List order = new List(); db.Queryable().ForEach(it=> { order.Add(it); } ,2000); 10.5 BulkDelete db.Deleteable(list).PageSize(1000).ExecuteCommand(); ```