FreeSqlの新しいクエリー機能の紹介

6296 ワード

FreeSql


FreeSqlは強力なNETStandardライブラリで、オブジェクト関係マッピングプログラム(O/RM)に使用され、CodeFirst/DbFirst/CURD/エクスプレッション関数/読み書き分離などの基礎パッケージを提供しています.支持するNETCore 2.1+または.NETFramework 4.6.1+.

新しいクエリー機能


まず、エンティティ定義を見てみましょう.
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 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 Songs { get; set; }
    public virtual ICollection Tags { get; set; }
}

3つのエンティティ、Song、Tag、および中間テーブルSongTagが定義されています.
1対1、複数対1のクエリー:
var t0 = fsql.Select().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` = '  ')

複数のクエリーのペア:
var t1 = fsql.Select().Where(a => a.Tags.AsSelect().Any(t => t.Parent.Id == 10)).ToSql();

変換を実行するSQL文:
var t1 = fsql.Select().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().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クエリーデータドキュメント』に移動します.

式関数

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がデータベースから実体クラスをインポートすることをサポートし、3種類のテンプレートジェネレータをサポートする.
  • ExpressionTree高性能読取データを採用する.
  • は、pgsqlの配列タイプなど、深いタイプのマッピングをサポートし、職人心の制作と言える.
  • は豊富な式関数をサポートします.
  • はナビゲーション属性クエリー、および遅延ロードをサポートします.
  • は同期/非同期データベースの操作方法をサポートし、多彩なチェーンクエリー方法を豊富にしている.
  • は読み書き分離、分表分庫、テナント設計をサポートする.
  • は多種のデータベースをサポートし、MySql/SqlServer/PostgreSQL/Oracle/Sqlite;

  • はじめに
    《Select》\
    《Update》\
    《Insert》\
    《Delete》
    初心者
    式関数
    《CodeFirst》\
    《DbFirst》
    達人
    《Repository》\
    《UnitOfWork》\
    『フィルター』
    不朽
    『読み書き分離』
    「区分表」
    『テナント』
    更新ログ

    クイックスタート


    以Netcore新プロジェクトを例に、新プロジェクトを作成
    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(Fsql);
    
        var builder = new ContainerBuilder();
    
        builder.RegisterFreeRepository(
            filter => filter
                .Apply("softdelete", a => a.IsDeleted == false)
                //        ,          
            ,
            this.GetType().Assembly
            //                  
        );
    
        builder.Populate(services);
        var container = builder.Build();
        return new AutofacServiceProvider(container);
    }

    コントローラでは、次のように通常のように倉庫を使用できます.
    [Route("restapi/[controller]")]
    public class SongsController : Controller {
    
        GuidRepository _songRepository;
    
        public SongsController(GuidRepository repos1) {
            _songRepository = repos1;
        }

    FreeSql.Repository


    FreeSql.Repositoryはabp vnextインタフェースを参照し,ベースの貯蔵層(CURD)を定義し実現する.それ以外に、それはまた実用的なグローバル、ローカルフィルタ機能、分表分方庫機能、および作業ユニットの実現である.
    フィルタ機能はクエリー時にフィルタリングできるだけでなく、削除/修正/挿入時にも検証を行い、プロセスを開いてデータセキュリティの問題を心配しないようにする.
    UnitOfWorkは複数の倉庫を1つのユニットに置いて管理して実行することができ、最終的には汎用Commitはすべての操作を実行し、内部にはデータベーストランザクションを採用している.

    終わりの言葉


    今回の更新は主に一対一、多対一、一対多、多対多のクエリーに関連しており、約束の構成が正しくない場合にナビゲーション属性を使用すると、友好的なエラーメッセージが表示されます.
    ご注目ありがとうございますgithub:https://github.com/2881099/FreeSqlああ、貴重な星をお願いします.ありがとうございます.