読者です 読者をやめる 読者になる 読者になる

ささいなことですが。

Windowsアプリテスト自動化ライブラリFriendly開発者の日記です。

LambdicSql - 生まれ変わりました -

LambdicSql C#

※注) 以前のブログもβ版に合わせてコードを修正しているので、前のブログ記事と比べても変化は感じられません。

LambdicSql_α0.0.51 をリリースしました。コードのほとんどを書き直すほどの破壊的大変更を入れました。まさにRebornなのです!
www.nuget.org
変更内容は盛りだくさんです。
先日、総監督と打ち合わせして、その内容をかなり取り込みました。ボリューミーなので何回かに分けて書きます。手っ取り早く全貌を見たい方は、こちらのページを参照お願いします。
github.com

変更一覧

  1. 書き心地100%UP
  2. 断捨離
  3. 文字列との組み合わせ
  4. 2WaySQL
  5. パラメータ名称
  6. Window関数対応

今回は1.を書きます。

書き心地 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));
}