GitHub - DotNetNext/SqlSugar: .Net aot ORM Fastest ORM DB2 Hana Simple Easy VB.NET Sqlite orm Oracle ORM Mysql Orm 虚谷数据库 postgresql ORm SqlServer oRm 达梦 ORM 人大金仓 ORM 神通ORM C# ORM , C# ORM .NET ORM NET5 ORM .NET6 ORM ClickHouse orm QuestDb ,TDengine ORM,OceanBase orm,GaussDB orm ,Tidb orm Object/Relational Mapping (original) (raw)
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
- Truly achieve zero SQL ORM table building, index and CRUD all support
- Support.NET millions of big data write, update, subtable and has billions of query statistics mature solutions
- Support SAAS complete application: cross-database query, audit, tenant sub-database, tenant sub-table and tenant data isolation
- Support low code + workflow (dynamic class building, dynamic table building, non-entity multi-library compatible with CRUD, JSON TO SQL, custom XML, etc.)
- Support ValueObject, discriminator, repository, UnitOfWork, DbContext, AOP
Documentation
Feature characteristic
Feature1 : Join query
Super simple query syntax
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();
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
//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
int pageIndex = 1; int pageSize = 20; int totalCount=0; var page = db.Queryable().ToPageList(pageIndex, pageSize, ref totalCount);
Feature4 : Dynamic expression
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();
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
//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
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
//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<OrderItem, Order>((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
Db.Storageable(list2).ExecuteCommand(); Db.Storageable(list2).PageSize(1000).ExecuteCommand(); Db.Storageable(list2).PageSize(1000,exrows=> { }).ExecuteCommand();
Feature9 : Auto split table
Split entity
[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
var lis2t = db.Queryable() .SplitTable(DateTime.Now.Date.AddYears(-1), DateTime.Now) .ToPageList(1,2);
Feature10 : Big data insert or update
10.1 BulkCopy db.Fastest().BulkCopy(lstData);//insert db.Fastest().PageSize(100000).BulkCopy(insertObjs); db.Fastest<System.Data.DataTable>().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<System.Data.DataTable>().AS("Order").BulkUpdate(dataTable,"Id");//Id is primary key
db.Fastest<System.Data.DataTable>().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();