Queryの組み立てシリーズです。まずは、クエリ単位で分割、構築する方法です。Concatでクエリを連結できるようにしました。Concatは型に関してわざと緩くしました。使っているDBの型が違っても結合できます。最終的にSQL文字列になったときに意味が通っていたらOKです。(ダメならSQL実行で例外が発生します。)
public void QueryConcat() { //句単位で別々に記述 var select = Db<DB>.Sql(db => Select( new SelectedData() { Name = db.tbl_staff.name, PaymentDate = db.tbl_remuneration.payment_date, Money = db.tbl_remuneration.money, })); var from = Db<DB>.Sql(db => From( db.tbl_remuneration). Join( db.tbl_staff, db.tbl_remuneration.staff_id == db.tbl_staff.id)); var where = Db<DB>.Sql(db => Where( 3000 < db.tbl_remuneration.money && db.tbl_remuneration.money < 4000)); var orderby = Db<DB>.Sql(db => OrderBy(new Asc(db.tbl_staff.name))); //クエリ構築 var query = select.Concat(from).Concat(where).Concat(orderby); //文字列化 Debug.Print(query.Build(typeof(SqlConnection)).Text); //Dapperを使っているなら、以下のように実行できます var datas = _connection.Query(query).ToList(); }
SELECT tbl_staff.name AS Name, tbl_remuneration.payment_date AS PaymentDate, tbl_remuneration.money AS Money FROM tbl_remuneration JOIN tbl_staff ON (tbl_remuneration.staff_id) = (tbl_staff.id) WHERE ((@p_0) < (tbl_remuneration.money)) AND ((tbl_remuneration.money) < (@p_1)) ORDER BY tbl_staff.name ASC
例えば、Where句以外は使いまわしとかの場合は、外の句はstatic readonlyにしておくと便利ですね。
static readonly SqlQuery<SelectedData> select = Db<DB>.Sql(db => Select(new SelectedData() { Name = db.tbl_staff.name, PaymentDate = db.tbl_remuneration.payment_date, Money = db.tbl_remuneration.money, })); static readonly ISqlQuery from = Db<DB>.Sql(db => From(db.tbl_remuneration). Join(db.tbl_staff, db.tbl_remuneration.staff_id == db.tbl_staff.id)); static readonly ISqlQuery orderby = Db<DB>.Sql(db => OrderBy(new Asc(db.tbl_staff.name))); public IEnumerable<SelectedData> Execute(decimal min, decimal max) { //Where句だけここで作成 var where = Db<DB>.Sql(db => Where( 3000 < db.tbl_remuneration.money && db.tbl_remuneration.money < 4000)); //クエリ構築 var query = select.Concat(from).Concat(where).Concat(orderby); //文字列化 Debug.Print(query.Build(typeof(SqlConnection)).Text); //Dapperを使っているなら、以下のように実行できます var datas = _connection.Query(query).ToList(); }
履歴
2016/09/02