🦄  FreeSql
FreeSql æ˜¯åŠŸèƒ½å¼ºå¤§çš„å¯¹è±¡å…³ç³»æ˜ å°„æŠ€æœ¯(O/RM),支�? .NETCore 2.1+ 或 .NETFramework 4.0+ 或 Xamarin。
- 支�? CodeFirst �?移,哪怕使用 Access 数�?�库也支�?;
- 支�? DbFirst 从数�?�库导入实体类,安装实体类生�?工具;
- 支�? æ·±å…¥çš„ç±»åž‹æ˜ å°„ï¼Œæ¯”å¦‚pgsql的数组类型;
- 支�? 丰富的表达�?函数,以�?��?�活的自定义解�?;
- 支�? 导航属性一对多�?å¤šå¯¹å¤šè´ªå©ªåŠ è½½ï¼Œä»¥ï¿½?ï¿½å»¶æ—¶åŠ è½½ï¼›
- 支�? 读写分离�?分表分库�?过滤器�?�?观�?�?悲观�?;
- 支�? MySql/SqlServer/PostgreSQL/Oracle/Sqlite/Firebird/达梦/人大金仓/神舟通用/Access;
📚  Documentation
FreeSql �??供多�?ä½¿ç”¨ä¹ æƒ¯ï¼Œè¯·æ ¹ï¿½?�实际情况选择团队�?�适的一�?:
- �?么FreeSql,原始用法;
- �?么FreeSql.Repository,仓储+工作�?ï¿½å…ƒä¹ æƒ¯ï¼›
- �?么FreeSql.DbContext,有点�?efcoreçš„ä½¿ç”¨ä¹ æƒ¯ï¼›
- �?么FreeSql.BaseEntity,求简�?�使用这个;
示范项目
- zhontai.net Admin �?��?�管�?�系统
- A simple and practical CMS implemented by .NET Core
- iusaas.com SaaS �?业应用管�?�系统
- EasyCms �?业建站,事业�?��?使用的CMS管�?�系统
- 内容管�?�系统
🚀  Quick start
dotnet add package FreeSql.Provider.Sqlite
static IFreeSql fsql = new FreeSql.FreeSqlBuilder()
.UseConnectionString(FreeSql.DataType.Sqlite, @"Data Source=document.db")
.UseAutoSyncStructure(true) //自动�?�æ¥å®žä½“结构到数�?�库
.Build(); //请务必定义�? Singleton �?�例模�?
class Song {
[Column(IsIdentity = true)]
public int Id { get; set; }
public string Title { get; set; }
public string Url { get; set; }
public DateTime CreateTime { get; set; }
public ICollection<Tag> Tags { get; set; }
}
class Song_tag {
public int Song_id { get; set; }
public Song Song { get; set; }
public int Tag_id { get; set; }
public Tag Tag { get; set; }
}
class Tag {
[Column(IsIdentity = true)]
public int Id { get; set; }
public string Name { get; set; }
public int? Parent_id { get; set; }
public Tag Parent { get; set; }
public ICollection<Song> Songs { get; set; }
public ICollection<Tag> Tags { get; set; }
}🔎  Query
//OneToOne�?ManyToOne
fsql.Select<Tag>().Where(a => a.Parent.Parent.Name == "粤è¯").ToList();
//OneToMany
fsql.Select<Tag>().IncludeMany(a => a.Tags, then => then.Where(sub => sub.Name == "xxx")).ToList();
//ManyToMany
fsql.Select<Song>()
.IncludeMany(a => a.Tags, then => then.Where(sub => sub.Name == "xxx"))
.Where(s => s.Tags.AsSelect().Any(t => t.Name == "国è¯"))
.ToList();
//Other
fsql.Select<Xxx>()
.Where(a => a.IsDelete == 0)
.WhereIf(keyword != null, a => a.UserName.Contains(keyword))
.WhereIf(role_id > 0, a => a.RoleId == role_id)
.Where(a => a.Nodes.AsSelect().Any(t => t.Parent.Id == t.UserId))
.Count(out var total)
.Page(page, size)
.OrderByDescending(a => a.Id)
.ToList()fsql.Select<Song>().Where(a => new[] { 1, 2, 3 }.Contains(a.Id)).ToList();
fsql.Select<Song>().Where(a => a.CreateTime.Date == DateTime.Today).ToList();
fsql.Select<Song>().OrderBy(a => Guid.NewGuid()).Limit(10).ToList();�?  Repository
dotnet add package FreeSql.Repository
[Transactional]
public void Add() {
var repo = ioc.GetService<BaseRepository<Tag>>();
repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
var item = new Tag {
Name = "testaddsublist",
Tags = new[] {
new Tag { Name = "sub1" },
new Tag { Name = "sub2" }
}
};
repo.Insert(item);
}�?�考:在 asp.net core ä¸ä½¿ç”¨ TransactionalAttribute + UnitOfWorkManager 实现多�?äº‹åŠ¡ä¼ æ’
💪  Performance
FreeSql Query & Dapper Query
Elapsed: 00:00:00.6733199; Query Entity Counts: 131072; ORM: Dapper
Elapsed: 00:00:00.4554230; Query Tuple Counts: 131072; ORM: Dapper
Elapsed: 00:00:00.6846146; Query Dynamic Counts: 131072; ORM: Dapper
Elapsed: 00:00:00.6818111; Query Entity Counts: 131072; ORM: FreeSql*
Elapsed: 00:00:00.6060042; Query Tuple Counts: 131072; ORM: FreeSql*
Elapsed: 00:00:00.4211323; Query ToList<Tuple> Counts: 131072; ORM: FreeSql*
Elapsed: 00:00:01.0236285; Query Dynamic Counts: 131072; ORM: FreeSql*FreeSql ToList & Dapper Query
Elapsed: 00:00:00.6707125; ToList Entity Counts: 131072; ORM: FreeSql*
Elapsed: 00:00:00.6495301; Query Entity Counts: 131072; ORM: Dapper👯  Contributors
systemhejiyong�? LambertW�? mypeng1985�? stulzq�? movingsam�? ALer-R�? zouql�? 深圳|凉茶�? densen2014�? LiaoLiaoWuJu�? hd2y�? tky753�? feijie999�? constantine�? JohnZhou2020�? mafeng8
QQ群:4336577(已满)�?8578575(在线)�?52508226(在线)
💕  Donation
L*y 58元�?花花 88元�?麦兜很乖 50元�?网络�?�者 2000元�?John 99.99元�?alex 666元�?bacongao 36元�?æ— ï¿½?? 100元�?Eternity 188元�?æ— ï¿½?? 10元�?⌒.Helper~..oO 66元�?ä¹ æƒ¯ä¸Žè¢«ä¹ æƒ¯ 100元�?æ— ï¿½?? 100元�?蔡易喋 88.88元�?ä¸è®¯ç§‘技 1000元�?Good Good Work 24元�?炽焰 6.6元�?Nothing 100元�?兰州天擎赵 500元�?哈利路亚 300元�? æ— ï¿½?? 100元�?蛰�? 99.99元�?TCYM 66.66元�?MOTA 5元�?LDZXG 30元�?Near 30元�?建爽 66元�?æ— ï¿½?? 200元�?LambertWu 100元�?æ— ï¿½?? 18.88元�?乌龙 50å…ƒ
Thank you for your donation

Formed in 2009, the Archive Team (not to be confused with the archive.org Archive-It Team) is a rogue archivist collective dedicated to saving copies of rapidly dying or deleted websites for the sake of history and digital heritage. The group is 100% composed of volunteers and interested parties, and has expanded into a large amount of related projects for saving online and digital history.

