FreeSqlの新しいクエリー機能の紹介
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エクスプレッション関数ドキュメント』へ
完全なプロパティ
まず、エンティティ定義を見てみましょう.
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エクスプレッション関数ドキュメント』へ
完全なプロパティ
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();
var t3 = select.OrderBy(a => Guid.NewGuid()).Limit(1).ToSql();
//SELECT top 1 ...
//FROM [Song] a
//ORDER BY newid()
はじめに
《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ああ、貴重な星をお願いします.ありがとうございます.
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はabp vnextインタフェースを参照し,ベースの貯蔵層(CURD)を定義し実現する.それ以外に、それはまた実用的なグローバル、ローカルフィルタ機能、分表分方庫機能、および作業ユニットの実現である.
フィルタ機能はクエリー時にフィルタリングできるだけでなく、削除/修正/挿入時にも検証を行い、プロセスを開いてデータセキュリティの問題を心配しないようにする.
UnitOfWorkは複数の倉庫を1つのユニットに置いて管理して実行することができ、最終的には汎用Commitはすべての操作を実行し、内部にはデータベーストランザクションを採用している.