ささいなことですが。

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

最近のLambdicSql - 自由度Up

github.com

組み合わせの自由度がアップしました。
Sqlビルダーという位置づけになった今、Sql構築の自由度は重要です。

+演算子のサポート

ちょっと前から生成したsql同士のサポートはありました。

var select = Db<DB>.Sql(db =>
    Select(new SelectData1
    {
        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(Asc(db.tbl_staff.name)));

//結合
var sql = select + from + where + orderby;

最近ではこれをLambda中で使うことができるようになりました。

var from = Db<DB>.Sql(db =>
        From(db.tbl_remuneration).
    Join(db.tbl_staff, db.tbl_remuneration.staff_id == db.tbl_staff.id));

//ラムダの中で結合
var sql = Db<DB>.Sql(db =>
    Select(new SelectData
    {
        Type = Case() +
                    When(db.tbl_remuneration.money < 2000).Then("Cheap") +
                    When(db.tbl_remuneration.money < 3000).Then("Middle") +
                    Else("High") +
                End()
    }) +
    from +
    Where(1000 < db.tbl_remuneration.money && db.tbl_remuneration.money < 4000) +
    OrderBy(Asc(db.tbl_remuneration.money), Desc(db.tbl_staff.name))
    );

これにより、より自由にSQLを組み立てることができるようになります。
例えば、Case式のWhen、Thenを条件によって追加とかね。

//checkMiddleが有効の時のみWhen、Thenの句を追加
//空のSqlは文字列に変換するときに消える
var whenThen = checkMiddle ? 
                  Db<DB>.Sql(db => When(db.tbl_remuneration.money < 3000).Then("Middle")) :
                  new Sql<string>();

var sql = Db<DB>.Sql(db =>
    Select(new SelectData
    {
        Type = Case<string>() +
                    When(db.tbl_remuneration.money < 2000).Then("Cheap") +
                    whenThen +
                    Else("High") +
                End()
    }).
    From(db.tbl_remuneration).
        Join(db.tbl_staff, db.tbl_remuneration.staff_id == db.tbl_staff.id).
    Where(1000 < db.tbl_remuneration.money && db.tbl_remuneration.money < 4000).
    OrderBy(Asc(db.tbl_remuneration.money), Desc(db.tbl_staff.name))
    );

是非お試しください!