※注) 以前のブログもβ版に合わせてコードを修正しているので、前のブログ記事と比べても変化は感じられません。
LambdicSql_α0.0.51 をリリースしました。コードのほとんどを書き直すほどの破壊的大変更を入れました。まさにRebornなのです!
www.nuget.org
変更内容は盛りだくさんです。
先日、総監督と打ち合わせして、その内容をかなり取り込みました。ボリューミーなので何回かに分けて書きます。手っ取り早く全貌を見たい方は、こちらのページを参照お願いします。
github.com
書き心地 100%Up(当社比)
大きくはこれです。以前比べると、かなり書きやすく、そして読みやすくなりました。
using Dapper; using LambdicSql; //★重要 using static. using static LambdicSql.Keywords; using static LambdicSql.Funcs; using static LambdicSql.Utils; public void TestStandard() { //ラムダでSQLを作成 var query = Db<DB>.Sql(db => Select(new SelectData { Name = db.tbl_staff.name, Count = Count(db.tbl_remuneration.money), Total = Sum(db.tbl_remuneration.money), Average = Avg(db.tbl_remuneration.money), Minimum = Min(db.tbl_remuneration.money), Maximum = Max(db.tbl_remuneration.money), }). From(db.tbl_remuneration). Join(db.tbl_staff, db.tbl_remuneration.staff_id == db.tbl_staff.id). GroupBy(db.tbl_staff.id, db.tbl_staff.name)); //文字列とパラメータに変更 var info = query.Build(_connection.GetType()); Debug.Print(info.SqlText); } public void TestCase() { //case文がこんなにすっきり書ける var query = Db<DB>.Sql(db => Select(new SelectData() { Type = Case(). When(db.tbl_staff.id == 3).Then("x"). When(db.tbl_staff.id == 4).Then("y"). Else("z"). End() }). From(db.tbl_staff)); }
Sql.Create()でまとめて書けるようになった
以前は句ごとに分かれていました。そのため、毎回 db=> て書く必要がありました。それが今回の変更で一つのExpressionとして表現するようになったので、db=>は最初の一回でよくなりました。
using staticを使いやすく変更
それから、これはVisualStudio2015を使ってないと無理なのですが(そろそろ、みんな使ってますよね?)メソッドをstaticにすることによって、using staticを使って唐突にメソッドを使えるようにしました。SelectとかSumとか唐突に呼べるようになって、さらにSQLっぽくなったのではないでしょうか。残念ながら、2013までの人はメソッドの前にクラス名を書く必要があります。
組み合わせ自由自在
以前までもできましたが、さらに自由になりました。暗黙の変換の導入でキャストの手間が減りました。まあ、キャストはコンパイルを通すためだけなので。
public void TestSqlExpression() { //式単位で扱うときも統一的に扱える var expMoneyAdd = Db<DB>.Sql(db => db.tbl_remuneration.money + 100); var expWhereMin = Db<DB>.Sql(db => 3000 < db.tbl_remuneration.money); var expWhereMax = Db<DB>.Sql(db => db.tbl_remuneration.money < 4000); //式の型を覚えていて、暗黙に変換される //上手く合わないときだけCast<>()メソッドを使う var query = Db<DB>.Sql(db => Select(new SelectData1() { Name = db.tbl_staff.name, PaymentDate = db.tbl_remuneration.payment_date, //decimalに変換される Money = expMoneyAdd, }). From(db.tbl_remuneration). Join(db.tbl_staff, db.tbl_remuneration.staff_id == db.tbl_staff.id). //boolに変換され、それらを&&や||で演算できる Where(expWhereMin && expWhereMax). OrderBy(new Asc(db.tbl_staff.name))); }
条件式作成も書きやすく、直感的に
public void TestWhereEx(bool minCondition, bool maxCondition) { //Conditionメソッドの第一引数は、その条件が有効か否かを設定 //無効なら消える //||演算も当然できるし、()を使った複雑な式にも対応 var exp = Sql<DB>.Create(db => Condition(minCondition, 3000 < db.tbl_remuneration.money) && Condition(maxCondition, db.tbl_remuneration.money < 4000)); //条件がなくなったらWhereは消えます var query = Sql<DB>.Create(db => SelectFrom(db.tbl_remuneration).Where(exp)); }