纯干货 FreeSql v0.3.17 新功能介绍

时间:2019-03-18
本文章向大家介绍纯干货 FreeSql v0.3.17 新功能介绍,主要包括纯干货 FreeSql v0.3.17 新功能介绍使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

新的查询功能

class Song {
    [Column(IsIdentity = true)]
    public int Id { get; set; }
    public DateTime? Create_time { get; set; }
    public bool? Is_deleted { get; set; }
    public string Title { get; set; }
    public string Url { get; set; }

    public virtual ICollection<Tag> Tags { get; set; }
}
class Song_tag {
    public int Song_id { get; set; }
    public virtual Song Song { get; set; }

    public int Tag_id { get; set; }
    public virtual Tag Tag { get; set; }
}
class Tag {
    [Column(IsIdentity = true)]
    public int Id { get; set; }
    public int? Parent_id { get; set; }
    public virtual Tag Parent { get; set; }

    public decimal? Ddd { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Song> Songs { get; set; }
    public virtual ICollection<Tag> Tags { get; set; }
}

//OneToOne、ManyToOne
var t0 = fsql.Select<Tag>().Where(a => a.Parent.Parent.Name == "粤语").ToSql();
//SELECT a.`Id`, a.`Parent_id`, a__Parent.`Id` as3, a__Parent.`Parent_id` as4, a__Parent.`Ddd`, a__Parent.`Name`, a.`Ddd` as7, a.`Name` as8 
//FROM `Tag` a 
//LEFT JOIN `Tag` a__Parent ON a__Parent.`Id` = a.`Parent_id` 
//LEFT JOIN `Tag` a__Parent__Parent ON a__Parent__Parent.`Id` = a__Parent.`Parent_id` 
//WHERE (a__Parent__Parent.`Name` = '粤语')

//OneToMany
var t1 = fsql.Select<Tag>().Where(a => a.Tags.AsSelect().Any(t => t.Parent.Id == 10)).ToSql();
//SELECT a.`Id`, a.`Parent_id`, a.`Ddd`, a.`Name` 
//FROM `Tag` a 
//WHERE (exists(SELECT 1 
//  FROM `Tag` t 
//  LEFT JOIN `Tag` t__Parent ON t__Parent.`Id` = t.`Parent_id` 
//  WHERE (t__Parent.`Id` = 10) AND (t.`Parent_id` = a.`Id`) 
//  limit 0,1))

//ManyToMany
var t2 = fsql.Select<Song>().Where(s => s.Tags.AsSelect().Any(t => t.Name == "国语")).ToSql();
//SELECT a.`Id`, a.`Create_time`, a.`Is_deleted`, a.`Title`, a.`Url` 
//FROM `Song` a
//WHERE(exists(SELECT 1
//  FROM `Song_tag` Mt_Ms
//  WHERE(Mt_Ms.`Song_id` = a.`Id`) AND(exists(SELECT 1
//      FROM `Tag` t
//      WHERE(t.`Name` = '国语') AND(t.`Id` = Mt_Ms.`Tag_id`)
//      limit 0, 1))
//  limit 0, 1))

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

表达式函数

var t1 = select.Where(a => new[] { 1, 2, 3 }.Contains(a.testFieldInt)).ToSql();
//SELECT a.`Id`, a.`Clicks`, a.`TestTypeInfoGuid`, a.`Title`, a.`CreateTime` 
//FROM `Song` a 
//WHERE (a.`Id` in (1,2,3))

查找今天创建的数据

var t2 = select.Where(a => a.CreateTime.Date == DateTime.Now.Date).ToSql();

SqlServer 下随机获取记录

var t3 = select.OrderBy(a => Guid.NewGuid()).Limit(1).ToSql();
//SELECT top 1 ...
//FROM [Song] a 
//ORDER BY newid()

更多前往wiki:《Expression 表达式函数文档》

完整特性

  • [x] 支持 CodeFirst 迁移;
  • [x] 支持 DbFirst 从数据库导入实体类,支持三种模板生成器;
  • [x] 采用 ExpressionTree 高性能读取数据;
  • [x] 支持深入的类型映射,比如pgsql的数组类型,堪称匠心制作;
  • [x] 支持丰富的表达式函数;
  • [x] 支持导航属性查询,和延时加载;
  • [x] 支持同步/异步数据库操作方法,丰富多彩的链式查询方法;
  • [x] 支持读写分离、分表分库,租户设计;
  • [x] 支持多种数据库,MySql/SqlServer/PostgreSQL/Oracle/Sqlite;
入门 《Select》 | 《Update》 | 《Insert》 | 《Delete》
新手 《表达式函数》 | 《CodeFirst》 | 《DbFirst》
高手 《Repository》 | 《UnitOfWork》 | 《过滤器》
不朽 《读写分离》 | 《分区分表》 | 《租户》 | 更新日志

快速开始

以 .net core 新项目为例,创建新项目

dotnet new webapi

引入 FreeSql 包

dotnet add package FreeSql.Repository

在 startup.cs 中定义 IFreeSql 和注入仓储

public Startup(IConfiguration configuration, ILoggerFactory loggerFactory) {
    Configuration = configuration;

    Fsql = new FreeSql.FreeSqlBuilder()
        .UseConnectionString(FreeSql.DataType.Sqlite, @"Data Source=|DataDirectory|/document.db;Pooling=true;Max Pool Size=10")
        .UseAutoSyncStructure(true)
        //自动同步实体结构到数据库
        .UseLazyLoading(true)
        //开启延时加载,导航属性

        .UseMonitorCommand(cmd => Trace.WriteLine(cmd.CommandText))
        //跟踪SQL执行语句
        .Build();
}

public IConfiguration Configuration { get; }
public IFreeSql Fsql { get; }

public IServiceProvider ConfigureServices(IServiceCollection services) {
    services.AddMvc();

    services.AddSingleton<IFreeSql>(Fsql);

    var builder = new ContainerBuilder();

    builder.RegisterFreeRepository(
        filter => filter
            .Apply<ISoftDelete>("softdelete", a => a.IsDeleted == false)
            //开启软删除过滤器,可定义多个全局过滤器
        ,
        this.GetType().Assembly
        //将本项目中所有继承实现的仓储批量注入
    );

    builder.Populate(services);
    var container = builder.Build();
    return new AutofacServiceProvider(container);
}

然后在 controller 中就可以像平常一样使用仓储了,如:

[Route("restapi/[controller]")]
public class SongsController : Controller {

    GuidRepository<Song> _songRepository;

    public SongsController(GuidRepository<Song> repos1) {
        _songRepository = repos1;
    }

结束语

本次更新主要涉及 一对一、多对一、一对多、多对多 的查询,当约定配置不正确的时候使用导航属性查询,会出现友好的错误提示。

感谢您的关注,github:https://github.com/2881099/FreeSql,求给出宝贵的一星,谢谢!