Rex-Guo / FreeSql

FreeSql is the ORM in .NetCore, .NetFramework, And Xamarin. It supports Mysql, Postgresql, SqlServer, Oracle, Sqlite, Odbc, 达梦, And MsAccess.

Home Page:http://freesql.net

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

FreeSql 是功能强大的对象关系映射技术(O/RM),支持 .NETCore 2.1+ 或 .NETFramework 4.0+ 或 Xamarin

扶摇直上,至强ORM只为自由编码;鹏程万里,至简Linq可使保留黑发;横批:FreeSql(诗人:Coder)

nuget stats GitHub license

Features

  • 支持 CodeFirst 迁移,哪怕使用 Access 数据库也支持;
  • 支持 DbFirst 从数据库导入实体类,安装实体类生成工具
  • 支持 深入的类型映射,比如pgsql的数组类型;
  • 支持 丰富的表达式函数,以及灵活的自定义解析;
  • 支持 导航属性一对多、多对多贪婪加载,以及延时加载;
  • 支持 读写分离、分表分库,租户设计,过滤器,乐观锁,悲观锁;
  • 支持 MySql/SqlServer/PostgreSQL/Oracle/Sqlite/达梦数据库/Access;

Documentation

《新人学习指引》 | 《Select》 | 《Update》 | 《Insert》 | 《Delete》
《表达式函数》 | 《CodeFirst》 | 《DbFirst》 | 《BaseEntity》
《Repository》 | 《UnitOfWork》 | 《过滤器》 | 《乐观锁》 | 《DbContext》
《读写分离》 | 《分区分表》 | 《租户》 | 《AOP》 | 《黑科技》 | 更新日志

FreeSql 提供多种使用习惯,请根据实际情况选择团队合适的一种:

学习项目

欢迎更多使用 FreeSql 的开源项目加入目录

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>()
  .Where(s => s.Tags.AsSelect().Any(t => t.Name == "国语"))
  .IncludeMany(a => a.Tags, then => then.Where(sub => sub.Name == "xxx"))
  .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()

更多前往Wiki:《Select 查询数据文档》

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();

更多前往Wiki:《表达式函数》

Repository & UnitOfWork

dotnet add package FreeSql.Repository

using (var uow = fsql.CreateUnitOfWork()) {
  var repo1 = uow.GetRepository<Song>();
  var repo2 = uow.GetRepository<Tag>();

  repo2.DbContextOptions.EnableAddOrUpdateNavigateList = true;
  repo2.Insert(new Tag {
    Name = "testaddsublist",
    Tags = new[] {
      new Tag { Name = "sub1" },
      new Tag { Name = "sub2" },
      new Tag {
        Name = "sub3",
        Tags = new[] {
          new Tag { Name = "sub3_01" }
        }
      }
    }
  });
  uow.Commit();
}

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

Test codeMore

Contributors

systemhejiyongLambertWmypeng1985stulzqmovingsamALer-Rzouql、 深圳|凉茶、 densen2014LiaoLiaoWuJuhd2ytky753feijie999

(QQ群:4336577)

Donation

L*y 58元、花花 88元、麦兜很乖 50元、网络来者 2000元、John 99.99元、alex 666元

Thank you for your donation

About

FreeSql is the ORM in .NetCore, .NetFramework, And Xamarin. It supports Mysql, Postgresql, SqlServer, Oracle, Sqlite, Odbc, 达梦, And MsAccess.

http://freesql.net

License:MIT License


Languages

Language:C# 99.9%Language:Visual Basic .NET 0.1%Language:Smalltalk 0.0%