SlideShare a Scribd company logo
Hokuriku.NET × JAZUG信州 -北陸・信州合同勉強会-
DeclarativeSql
- 属性ベーステーブルマッピングとSQLの自動生成 -
Name
鈴木 孝明
Twitter Account
@xin9le
Award
Microsoft MVP for .NET
Web Site
http://xin9le.net
About Me
DeclarativeSql
ライブラリ作成のモチベーション
Why declarative ?
Dapper
軽量で超高速なO/R Mapper
POCOへのマッピングのみを請け負うので、SQLは完全直書き
Entity Framework
LINQによるDBアクセスからO/Rマッピングまでフルサポート
SQLの直書きはないが、パッと使うには仰々しい感
Dapper vs Entity Framework
昨今のチーム事情
けど
定型SQLは
楽したい
チーム全員
SQL星人
でも
LINQもEFも
できない
ってことは
Dapper一択
そうだ、型情報からSQL作ろう
update Person
set
Age = @Age
where Name = @Name
and Sex = @Sex
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public int Sex { get; set; }
}
こんな感じになったら嬉しい
簡易な定型文のみをサポート
「それって何てEntity Framework?」にならないように
複雑なクエリが必要なときはSQL星人たちの神業に頼ればよい
自由度とメンテナンス性の両立
SQLの自動生成 = いくらかバグの混入を防ぐことができる
機能を求め過ぎて中途半端になるくらいならSQLの直書きも許容
求め過ぎないという割り切り
https://github.com/xin9le/DeclarativeSql
It’s Free & Open Source
PM> Install-Package DeclarativeSql.Core
PM> Install-Package DeclarativeSql.Dapper
「ちょっとの便利」を後押しするコア機能
DeclarativeSql.Core
using (var connection = DbProvider.CreateConnection(DbKind.SqlServer, "接続文字列"))
{
connection.Open();
//--- 何かデータベース操作
}
EnumベースでのDB接続生成
対象DBを
引数で変更
可能
Oracle
MySQL
などもOK
using (var connection = DbProvider.CreateConnection(DbKind.Oracle, "接続文字列"))
using (var transaction = connection.StartTransaction())
{
//--- レコードの挿入/更新/削除など
transaction.Complete();
}
usingによるトランザクション
Transaction
Scopeと
同じ使い方
[Table("Person", Schema = "dbo")] //--- テーブル名の指定
public class Person
{
[Key] //--- 主キー
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] //--- 自動採番
public int Id { get; set; }
[Required] //--- NotNull
[Column("名前")] //--- 列名の指定
public string Name { get; set; }
[Sequence("AgeSeq", Schema = "dbo")] //--- シーケンスの利用 (Oracleなどで)
public int? Age { get; set; }
[NotMapped] //--- マッピングしない
public int Sex { get; set; }
}
属性によるマッピング型定義
Code Firstと
ほぼ同様
public sealed class TableMappingInfo
{
public Type Type { get; } //--- マッピングするクラスの型
public string Schema { get; } //--- テーブルのスキーマ名
public string Name { get; } //--- テーブル名
public IReadOnlyList<ColumnMappingInfo> Columns { get; } //--- 列マッピング情報
public static TableMappingInfo Create<T>(){ … }; //--- メタデータの取得
}
マッピングメタデータの提供 #1
キャッシュ
が効くので
高速
public sealed class ColumnMappingInfo
{
public string PropertyName { get; } //--- プロパティ名
public Type PropertyType { get; } //--- プロパティのデータ型
public string ColumnName { get; } //--- 列名
public DbType ColumnType { get; } //--- 列のデータ型
public bool IsPrimaryKey { get; } //--- 主キーかどうか
public bool IsNullable { get; } //--- NULL許可かどうか
public bool IsIdentity { get; } //--- 自動採番をするどうか
public SequenceMappingInfo Sequence { get; } //--- 設定されているシーケンス情報
}
マッピングメタデータの提供 #2
public sealed class SequenceMappingInfo
{
public string Schema { get; } //--- シーケンスのスキーマ名
public string Name { get; } //--- シーケンス名
}
マッピングメタデータの提供 #3
//--- 指定の列のみを対象として全レコード取得
var sql = PrimitiveSql.CreateSelect<Person>(x => x.Id, x => x.Name);
/*
select
Id as Id,
名前 as Name
from dbo.Person
*/
プリミティブなSQLの生成 #1
指定がない
場合は
全列が対象
//--- 指定の列のみを対象として全レコードを更新
var sql = PrimitiveSql.CreateUpdate<Person>(DbKind.SqlServer, x => x.Name);
/*
update dbo.Person
set
名前 = @Name
*/
プリミティブなSQLの生成 #2
Bind変数の
接頭辞の
決定に必要
指定がない
場合は
全列が対象
Dapperを基にした超簡単で直観的なCRUD操作
DeclarativeSql.Dapper
//--- 全件取得
var p1 = connection.Select<Person>();
//--- Id, Name 列に絞って全件取得
var p2 = connection.Select<Person>(x => x.Id, x => x.Name);
//--- Id = 3 のレコードのみ取得
var p3 = connection.Select<Person>(x => x.Id == 3);
//--- Id > 3 のレコードを Id, Name 列に絞って取得
var p4 = connection.Select<Person>(x => x.Id > 3, x => x.Id, x => x.Name);
レコードの取得
.Select<T>
//--- 指定されたデータを挿入
var p5 = connection.Insert(new Person { Name = "xin9le", Age = 30 });
//--- 複数のレコードでもOK
var p6 = connection.Insert(new []
{
new Person { Name = "yoshiki", Age= 49, },
new Person { Name = "suzuki", Age= 30, },
new Person { Name = "anders", Age= 54, },
});
レコード挿入
.Insert<T>
//--- Age = 30 のレコードの Name 列を更新
var p7 = connection.Update
(
new Person { Name = “xin9le" },
x => x.Age == 30, //--- 指定しなければ全レコード更新
x => x.Name //--- 指定がなければ全列更新
);
レコード更新
.Update<T>
//--- 全レコード削除
var p8 = connection.Delete<Person>();
//--- 年齢が30歳でないレコードを削除
var p9 = connection.Delete<Person>(x => x.Age != 30);
//--- テーブルの切り捨て
var p10 = connection.Truncate<Person>();
レコード削除
.Delete<T>
.Truncate<T>
//--- メソッド名に ‘Async’ を付けるだけ
var p1 = await connection.SelectAsync<Person>();
var p2 = await connection.InsertAsync(new Person { Name = "xin9le" });
var p3 = await connection.UpdateAsync(new Person { Name = "xin9le" });
var p4 = await connection.DeleteAsync<Person>();
もちろん非同期版も
実際に非同期処理になるかは各DBプロバイダーに依存する
Simple = Speed + Power
Dapperの強みをそのままに、select * などの決まった手間を軽減
たった1文で書けるDBアクセス
サポートしていない構文
inner join / left join / order by / group by / サブクエリー (etc.)
やり過ぎは複雑さの増大と自由度の低下を招く
シンプルに、そしてカジュアルに
Have a nice database operation!!
Thank you

More Related Content

What's hot (20)

PDF
いろいろ考えると日本語の全文検索もMySQLがいいね!
Kouhei Sutou
 
PDF
R以外の研究ツール
弘毅 露崎
 
PDF
Solrベースの全文検索サーバ Fess
Shinsuke Sugaya
 
PDF
Webで役立つRDBの使い方
Soudai Sone
 
PDF
20150520 lt-neo4j勉強会-neofj fdw
Toshi Harada
 
PDF
DBFluteを用いて開発されている全文検索システムFess
Shinsuke Sugaya
 
PDF
Pgunconf neo4j fdw
Toshi Harada
 
PDF
Elasticsearch入門 pyfes 201207
Jun Ohtani
 
PDF
Chugoku db 20th-postgresql-10-pub
Toshi Harada
 
PDF
MySQL Casual Talks Vol.4 「MySQL-5.6で始める全文検索 〜InnoDB FTS編〜」
Kentaro Yoshida
 
PDF
Fess/Elasticsearchを使った業務で使える?全文検索への道
Shinsuke Sugaya
 
PDF
Sbtのマルチプロジェクトはいいぞ
Yoshitaka Fujii
 
PDF
Incoming PostgreSQL 9.4 次バージョンの新機能をご紹介
Ryuichiro Munechika
 
PDF
知って得するWebで便利なpostgre sqlの3つの機能
Soudai Sone
 
PDF
PostgreSQLとPythonとSQL
Satoshi Yamada
 
PDF
Chugokudb18_1
Kosuke Kida
 
PDF
ニコニコニュースと全文検索
techtalkdwango
 
PPTX
WebAppDev勉強会 #2 at cafe? IKAGAWA DO
Kohei Noda
 
PDF
ESFluteによるElasticsearchでのO/Rマッパーを用いた開発
Shinsuke Sugaya
 
PDF
Elasticsearchベースの全文検索システムFess
Shinsuke Sugaya
 
いろいろ考えると日本語の全文検索もMySQLがいいね!
Kouhei Sutou
 
R以外の研究ツール
弘毅 露崎
 
Solrベースの全文検索サーバ Fess
Shinsuke Sugaya
 
Webで役立つRDBの使い方
Soudai Sone
 
20150520 lt-neo4j勉強会-neofj fdw
Toshi Harada
 
DBFluteを用いて開発されている全文検索システムFess
Shinsuke Sugaya
 
Pgunconf neo4j fdw
Toshi Harada
 
Elasticsearch入門 pyfes 201207
Jun Ohtani
 
Chugoku db 20th-postgresql-10-pub
Toshi Harada
 
MySQL Casual Talks Vol.4 「MySQL-5.6で始める全文検索 〜InnoDB FTS編〜」
Kentaro Yoshida
 
Fess/Elasticsearchを使った業務で使える?全文検索への道
Shinsuke Sugaya
 
Sbtのマルチプロジェクトはいいぞ
Yoshitaka Fujii
 
Incoming PostgreSQL 9.4 次バージョンの新機能をご紹介
Ryuichiro Munechika
 
知って得するWebで便利なpostgre sqlの3つの機能
Soudai Sone
 
PostgreSQLとPythonとSQL
Satoshi Yamada
 
Chugokudb18_1
Kosuke Kida
 
ニコニコニュースと全文検索
techtalkdwango
 
WebAppDev勉強会 #2 at cafe? IKAGAWA DO
Kohei Noda
 
ESFluteによるElasticsearchでのO/Rマッパーを用いた開発
Shinsuke Sugaya
 
Elasticsearchベースの全文検索システムFess
Shinsuke Sugaya
 

Viewers also liked (18)

PPTX
開発キックオフ時にマネージャが行うべき11のこと ~Visual Studio Online & TFS 使い始めと HOME 画面の構成
慎一 古賀
 
PDF
[data analytics showcase] A12: データに隠された課題、ちゃんと見えていますか? by Tableau Japan 株式会社 ...
Insight Technology, Inc.
 
PDF
Xamarin 概要 @ 「Xamarin」って何? Wエバンジェリストによる特濃「Xamarin」勉強会 Rev2
Yoshito Tabuchi
 
PDF
What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...
Yoshifumi Kawai
 
PDF
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Yoshifumi Kawai
 
KEY
ノンデザイナーのための配色理論
tsukasa obara
 
PPT
色彩センスのいらない配色講座
Mariko Yamaguchi
 
PDF
見やすいプレゼン資料の作り方 - リニューアル増量版
MOCKS | Yuta Morishige
 
PDF
「ずいぶんとダサいライティングを使っているのね」〜UniRxを用いた物理ベースライティング制御〜
Toru Nayuki
 
PDF
Interactive UI with UniRx
Yuto Iwashita
 
PPTX
若輩エンジニアから見たUniRxを利用したゲーム開発
Hirohito Morinaga
 
PDF
Introduction to NotifyPropertyChangedGenerator
Yoshifumi Kawai
 
PPTX
はじめてのUniRx
torisoup
 
PDF
ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC
Yoshifumi Kawai
 
PPTX
Clash of Oni Online - VR Multiplay Sword Action
Yoshifumi Kawai
 
PDF
Observable Everywhere - Rxの原則とUniRxにみるデータソースの見つけ方
Yoshifumi Kawai
 
PDF
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
Yoshifumi Kawai
 
PDF
Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用
Yoshifumi Kawai
 
開発キックオフ時にマネージャが行うべき11のこと ~Visual Studio Online & TFS 使い始めと HOME 画面の構成
慎一 古賀
 
[data analytics showcase] A12: データに隠された課題、ちゃんと見えていますか? by Tableau Japan 株式会社 ...
Insight Technology, Inc.
 
Xamarin 概要 @ 「Xamarin」って何? Wエバンジェリストによる特濃「Xamarin」勉強会 Rev2
Yoshito Tabuchi
 
What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...
Yoshifumi Kawai
 
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Yoshifumi Kawai
 
ノンデザイナーのための配色理論
tsukasa obara
 
色彩センスのいらない配色講座
Mariko Yamaguchi
 
見やすいプレゼン資料の作り方 - リニューアル増量版
MOCKS | Yuta Morishige
 
「ずいぶんとダサいライティングを使っているのね」〜UniRxを用いた物理ベースライティング制御〜
Toru Nayuki
 
Interactive UI with UniRx
Yuto Iwashita
 
若輩エンジニアから見たUniRxを利用したゲーム開発
Hirohito Morinaga
 
Introduction to NotifyPropertyChangedGenerator
Yoshifumi Kawai
 
はじめてのUniRx
torisoup
 
ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC
Yoshifumi Kawai
 
Clash of Oni Online - VR Multiplay Sword Action
Yoshifumi Kawai
 
Observable Everywhere - Rxの原則とUniRxにみるデータソースの見つけ方
Yoshifumi Kawai
 
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
Yoshifumi Kawai
 
Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用
Yoshifumi Kawai
 
Ad

Similar to DeclarativeSql (20)

PDF
ADO.NETとORMとMicro-ORM -dapper dot netを使ってみた
Narami Kiyokura
 
PDF
よろしい、ならばMicro-ORMだ
Narami Kiyokura
 
PDF
Entity Framework
Nakashima Yujiro
 
PDF
Daisukei vsug ef
vsug_jim
 
PDF
VSUG Day 2010 Summer - Using ADO.NET Entity Framework
Atsushi Fukui
 
PPTX
Sql world を支える技術
Oda Shinsuke
 
PDF
Open棟梁機能紹介 v02-00
Daisuke Nishino
 
PDF
Vsug ef
Microsoft
 
PPTX
20110607
小野 修司
 
PDF
Mvc conf session_4_ono
Hiroshi Okunushi
 
PPTX
Entity Framework 5.0 deep dive
Atsushi Fukui
 
PPTX
Oracle Database Cloud と無料の純正開発ツールで開発効率を改善しよう!(db tech showcase 2016 Oracle セッ...
オラクルエンジニア通信
 
PPTX
ビジネス向けアプリケーションにこそ進めるMicro orm
Tadahiro Ishisaka
 
PDF
Entity Framework(Core)についての概要を学ぼう
TomomitsuKusaba
 
PPTX
The seminar of asp.net at 201908 sakurug
SAKURUG co.
 
PDF
Oracle Databaseを用いて学ぶ RDBMSの基本 (抜粋版) - JPOUG Oracle Database入学式 2016
Ryota Watabe
 
PDF
『これからの.NETアプリケーション開発』セミナー .NET用アプリケーション フレームワーク Open 棟梁 概説
Daisuke Nishino
 
PPTX
uroboroSQLの紹介 (OSC2017 Tokyo/Spring)
Kenichi Hoshi
 
PPTX
.NET Standard で PostgreSql を使ってみた
m ishizaki
 
PDF
モバイルゲームの「大規模な開発」かつ「高頻度の更新」を実現するための開発環境整備の取り組み
MorioImai
 
ADO.NETとORMとMicro-ORM -dapper dot netを使ってみた
Narami Kiyokura
 
よろしい、ならばMicro-ORMだ
Narami Kiyokura
 
Entity Framework
Nakashima Yujiro
 
Daisukei vsug ef
vsug_jim
 
VSUG Day 2010 Summer - Using ADO.NET Entity Framework
Atsushi Fukui
 
Sql world を支える技術
Oda Shinsuke
 
Open棟梁機能紹介 v02-00
Daisuke Nishino
 
Vsug ef
Microsoft
 
20110607
小野 修司
 
Mvc conf session_4_ono
Hiroshi Okunushi
 
Entity Framework 5.0 deep dive
Atsushi Fukui
 
Oracle Database Cloud と無料の純正開発ツールで開発効率を改善しよう!(db tech showcase 2016 Oracle セッ...
オラクルエンジニア通信
 
ビジネス向けアプリケーションにこそ進めるMicro orm
Tadahiro Ishisaka
 
Entity Framework(Core)についての概要を学ぼう
TomomitsuKusaba
 
The seminar of asp.net at 201908 sakurug
SAKURUG co.
 
Oracle Databaseを用いて学ぶ RDBMSの基本 (抜粋版) - JPOUG Oracle Database入学式 2016
Ryota Watabe
 
『これからの.NETアプリケーション開発』セミナー .NET用アプリケーション フレームワーク Open 棟梁 概説
Daisuke Nishino
 
uroboroSQLの紹介 (OSC2017 Tokyo/Spring)
Kenichi Hoshi
 
.NET Standard で PostgreSql を使ってみた
m ishizaki
 
モバイルゲームの「大規模な開発」かつ「高頻度の更新」を実現するための開発環境整備の取り組み
MorioImai
 
Ad

More from Takaaki Suzuki (20)

PDF
5 分で学ぶ Interpolated String Handler
Takaaki Suzuki
 
PDF
C# における Redis 徹底活用
Takaaki Suzuki
 
PDF
Inside FastEnum
Takaaki Suzuki
 
PDF
今日からできる!簡単 .NET 高速化 Tips
Takaaki Suzuki
 
PDF
30min Serverless xTuber
Takaaki Suzuki
 
PPTX
Tetris Algorithm
Takaaki Suzuki
 
PPTX
C# 7 New Features
Takaaki Suzuki
 
PPTX
Live Coding で学ぶ C# 7
Takaaki Suzuki
 
PPTX
C# 7 Current Status
Takaaki Suzuki
 
PPTX
4 Colors Othello’s Algorithm
Takaaki Suzuki
 
PPTX
Sharing Deep Dive
Takaaki Suzuki
 
PDF
4 Colors Othello’s Algorithm @仙台 IT 文化祭 2017
Takaaki Suzuki
 
PDF
Sevens Algorithm
Takaaki Suzuki
 
PDF
Friendly
Takaaki Suzuki
 
PDF
WPF Interoperability
Takaaki Suzuki
 
PDF
Universal Appとは? -デバイスに依存しないアプリケーション開発-
Takaaki Suzuki
 
PDF
酒の肴はC# vNext
Takaaki Suzuki
 
PDF
Async History in .NET
Takaaki Suzuki
 
PDF
SignalR Tune-up
Takaaki Suzuki
 
PDF
Twilioと.NET
Takaaki Suzuki
 
5 分で学ぶ Interpolated String Handler
Takaaki Suzuki
 
C# における Redis 徹底活用
Takaaki Suzuki
 
Inside FastEnum
Takaaki Suzuki
 
今日からできる!簡単 .NET 高速化 Tips
Takaaki Suzuki
 
30min Serverless xTuber
Takaaki Suzuki
 
Tetris Algorithm
Takaaki Suzuki
 
C# 7 New Features
Takaaki Suzuki
 
Live Coding で学ぶ C# 7
Takaaki Suzuki
 
C# 7 Current Status
Takaaki Suzuki
 
4 Colors Othello’s Algorithm
Takaaki Suzuki
 
Sharing Deep Dive
Takaaki Suzuki
 
4 Colors Othello’s Algorithm @仙台 IT 文化祭 2017
Takaaki Suzuki
 
Sevens Algorithm
Takaaki Suzuki
 
Friendly
Takaaki Suzuki
 
WPF Interoperability
Takaaki Suzuki
 
Universal Appとは? -デバイスに依存しないアプリケーション開発-
Takaaki Suzuki
 
酒の肴はC# vNext
Takaaki Suzuki
 
Async History in .NET
Takaaki Suzuki
 
SignalR Tune-up
Takaaki Suzuki
 
Twilioと.NET
Takaaki Suzuki
 

Recently uploaded (10)

PDF
プライバシ保護のためのインターネットアーキテクチャの進化 (2025-07-11)
Jun Kurihara
 
PDF
Hyperledger Fabric最新v3.x系での機能強化、変更点にキャッチアップ!
LFDT Tokyo Meetup
 
PDF
SIG-AUDIO 2025 Vol.02 オンラインセミナー SIG-Audioプレゼン資料_オーディオプラグイン開発_塩澤達矢.pdf
IGDA Japan SIG-Audio
 
PDF
20250710_Devinで切り拓くDB革命_〜価値創出に集中せよ〜.pdf
Masaki Yamakawa
 
PDF
人気ブロックチェーン基盤「Hyperledger Fabric」最新版を動かしてみた!
LFDT Tokyo Meetup
 
PDF
Hyperledger Fabric公式サンプル fabric-samples徹底解説
LFDT Tokyo Meetup
 
PDF
生成AIパネルトーク(Interop25Tokyo APPS JAPAN M1-07,M2-07 嶋ポジショントーク)
嶋 是一 (Yoshikazu SHIMA)
 
PDF
[Hardening Designers Confernece 2025]ランサムウェアでの見えざるログ・見えるログ
kataware
 
PDF
20250630_aws_reinforce_2025_aws_sheild_network_security_director
uedayuki
 
PDF
ABC2025S LT講演「世界の窓から Androidこんにちは2025」アプリ自動生成の将来?ロボティクスの夢再び?
嶋 是一 (Yoshikazu SHIMA)
 
プライバシ保護のためのインターネットアーキテクチャの進化 (2025-07-11)
Jun Kurihara
 
Hyperledger Fabric最新v3.x系での機能強化、変更点にキャッチアップ!
LFDT Tokyo Meetup
 
SIG-AUDIO 2025 Vol.02 オンラインセミナー SIG-Audioプレゼン資料_オーディオプラグイン開発_塩澤達矢.pdf
IGDA Japan SIG-Audio
 
20250710_Devinで切り拓くDB革命_〜価値創出に集中せよ〜.pdf
Masaki Yamakawa
 
人気ブロックチェーン基盤「Hyperledger Fabric」最新版を動かしてみた!
LFDT Tokyo Meetup
 
Hyperledger Fabric公式サンプル fabric-samples徹底解説
LFDT Tokyo Meetup
 
生成AIパネルトーク(Interop25Tokyo APPS JAPAN M1-07,M2-07 嶋ポジショントーク)
嶋 是一 (Yoshikazu SHIMA)
 
[Hardening Designers Confernece 2025]ランサムウェアでの見えざるログ・見えるログ
kataware
 
20250630_aws_reinforce_2025_aws_sheild_network_security_director
uedayuki
 
ABC2025S LT講演「世界の窓から Androidこんにちは2025」アプリ自動生成の将来?ロボティクスの夢再び?
嶋 是一 (Yoshikazu SHIMA)
 

DeclarativeSql