FreeSql 新查詢功能介紹

FreeSql

FreeSql 是一個功能強大的 NETStandard 庫,用於對象關係映射程序(O/RM),提供了 CodeFirst/DbFirst/CURD/表達式函數/讀寫分離 等基礎封裝。支持 .NETCore 2.1+ 或 .NETFramework 4.6.1+。git

新的查詢功能

且先看看實體定義:github

public 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; }
}
public 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; }
}
public 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; }
}

以上定義了三個實體,Song、Tag,以及中間表SongTag。web

一對1、多對一的查詢:sql

var t0 = fsql.Select<Tag>().Where(a => a.Parent.Parent.Name == "粵語").ToSql();

執行轉換的SQL語句:數據庫

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` = '粵語')

一對多的查詢:api

var t1 = fsql.Select<Tag>().Where(a => a.Tags.AsSelect().Any(t => t.Parent.Id == 10)).ToSql();

執行轉換的SQL語句:數組

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

多對多的查詢:安全

var t2 = fsql.Select<Song>().Where(s => s.Tags.AsSelect().Any(t => t.Name == "國語")).ToSql();

執行轉換的SQL語句:異步

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查詢數據文檔》ide

表達式函數

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 表達式函數文檔》

完整特性

  • 支持 CodeFirst 遷移;
  • 支持 DbFirst 從數據庫導入實體類,支持三種模板生成器;
  • 採用 ExpressionTree 高性能讀取數據;
  • 支持深刻的類型映射,好比pgsql的數組類型,堪稱匠心製做;
  • 支持豐富的表達式函數;
  • 支持導航屬性查詢,和延時加載;
  • 支持同步/異步數據庫操做方法,豐富多彩的鏈式查詢方法;
  • 支持讀寫分離、分表分庫,租戶設計;
  • 支持多種數據庫,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;
    }

FreeSql.Repository

FreeSql.Repository 參考 abp vnext 接口,定義和實現基礎的倉儲層(CURD)。除此之外,它還實用的全局、局部過濾器功能,分表分方庫功能,以及工做單元的實現;

過濾器功能不只能夠查詢時過濾,連刪除/修改/插入時都會進行驗證,避免開過過程擔憂數據安全問題;

UnitOfWork 可將多個倉儲放在一個單元管理執行,最終通用 Commit 執行全部操做,內部採用了數據庫事務;

結束語

本次更新主要涉及 一對1、多對1、一對多、多對多 的查詢,當約定配置不正確的時候使用導航屬性,會出現友好的錯誤提示。

感謝您的關注,github:https://github.com/2881099/FreeSql,求給出寶貴的一星,謝謝!

相關文章
相關標籤/搜索