neueさんからご意見いただいたので、改善しました。
Expressionで受ける必要ないのでは?
確かに。
シンプルなものは受ける必要がないですね・・・。
書き味悪いし、Expressionは軽い処理ではないので必要ないなら使わない方がいい。
なので、FormattableString で受けるバージョンを追加しました。
publicpartialclass Db { publicstatic Sql InterpolateSql(FormattableString formattableString); publicstatic Sql<TResult> InterpolateSql<TResult>(FormattableString formattableString); }
シンプルに使いたい場合はこっちの方がいいですね。
staticvoid Sample0(IDbConnection cnn) { var city = "London"; var contactTitle = "Sales Representative"; var sql = Db.InterpolateSql<Customers>( $@"SELECT *FROM CustomersWHERE City = {city}AND ContactTitle = {contactTitle}" ); //実行時にコンソールに出力する設定 DapperAdapter.Log = x => Console.WriteLine(x); //Dapperで実行 var datas = cnn.Query(sql).ToList(); }
Expression版は必要ないか?
とは言え、これはこれで便利なところもあるので残します。
式を入れれたり
var sql = Db<DB>.InterpolateSql<Customers>(db => $@"SELECT *FROM CustomersWHERE {(db.Customers.City == city && db.Customers.ContactTitle == contactTitle)}" );
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})");
上手く改行できなくてちょっと残念。