ささいなことですが。

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

LambdicSql - 続 String interpolation 対応しました。

neueさんからご意見いただいたので、改善しました。

Expressionで受ける必要ないのでは?

確かに。
シンプルなものは受ける必要がないですね・・・。
書き味悪いし、Expressionは軽い処理ではないので必要ないなら使わない方がいい。
なので、FormattableString で受けるバージョンを追加しました。

public partial class Db
{
    public static Sql InterpolateSql(FormattableString formattableString);
    public static Sql<TResult> InterpolateSql<TResult>(FormattableString formattableString);
}

シンプルに使いたい場合はこっちの方がいいですね。

static void Sample0(IDbConnection cnn)
{
    var city = "London";
    var contactTitle = "Sales Representative";

    var sql = Db.InterpolateSql<Customers>(
$@"SELECT *
FROM Customers
WHERE City = {city}
AND ContactTitle = {contactTitle}"
       );

    //実行時にコンソールに出力する設定
    DapperAdapter.Log = x => Console.WriteLine(x);

    //Dapperで実行
    var datas = cnn.Query(sql).ToList();
}

f:id:ishikawa-tatsuya:20170716071728p:plain

Expression版は必要ないか?

とは言え、これはこれで便利なところもあるので残します。
式を入れれたり

var sql = Db<DB>.InterpolateSql<Customers>(db =>
$@"SELECT *
FROM Customers
WHERE {(db.Customers.City == city && db.Customers.ContactTitle == contactTitle)}"
   );

f:id:ishikawa-tatsuya:20170716073611p:plain
LambdicSqlのオブジェクトを入れたりできます。

var sub = Db<DB>.Sql(db =>
    Select(Sum(db.tbl_remuneration.money)).
    From(db.tbl_remuneration)
    );
var sql = Db.InterpolateSql<Customers>(() =>$@"SELECT Total = ({sub})");

上手く改行できなくてちょっと残念。
f:id:ishikawa-tatsuya:20170716073020p:plain