LambdicSqlではExpression単位で分解、構築できるようにしました。
Castっていうキーワードがポイントです。Sql.Query
publicvoid SqlExtension() { var expMoneyAdd = Sql<DB>.Create(db => db.tbl_remuneration.money + 100); var expWhereMin = Sql<DB>.Create(db => 3000< db.tbl_remuneration.money); var expWhereMax = Sql<DB>.Create(db => db.tbl_remuneration.money < 4000); var query = Sql<DB>.Create(db => Select(new SelectedData() { Name = db.tbl_staff.name, PaymentDate = db.tbl_remuneration.payment_date, //作っておいたExpressionを組み込み//最終的にはdecimalで扱いたい Money = expMoneyAdd.Cast<decimal>(), }). From(db.tbl_remuneration). Join(db.tbl_staff, db.tbl_remuneration.staff_id == db.tbl_staff.id). //組み合わせることも可能です。 Where(expWhereMin && expWhereMax). OrderBy(new Asc(db.tbl_staff.name))); //文字列化 Debug.Print(query.ToSqlInfo(typeof(SqlConnection)).SqlText); //Dapperを使っているなら、以下のように実行できます var datas = _connection.Query(query).ToList(); }
SELECT tbl_staff.name AS Name, tbl_remuneration.payment_date AS PaymentDate, (tbl_remuneration.money) + (@p_0) AS Money FROM tbl_remuneration JOIN tbl_staff ON (tbl_remuneration.staff_id) = (tbl_staff.id) WHERE ((@p_1) < (tbl_remuneration.money)) AND ((tbl_remuneration.money) < (@p_2)) ORDERBY tbl_staff.name ASC
条件文を構築しやすくるためのヘルパ
条件文も上の書き方で、連結していけるわけですが、ちょっと面倒です。
//こんな感じで連結可能 var expWhereMin = Sql<DB>.Create(db => 3000< db.tbl_remuneration.money); var expWhereMax = Sql<DB>.Create(db => db.tbl_remuneration.money < 4000); var expWhere = Sql<DB>.Create(db => expWhereMin && expWhereMax.Cast);
これはよくやるので、簡単にかけるようにしました。
Whereの組み立てで、その条件を有効にするか否かは頻繁にあり、そこで便利に使うことができます。ちなみに全部無効でExpressionが空になった場合はWhere句自体が消えます。
publicvoid ContinueConditions(bool minEnable, bool maxEnable) { //その条件を有効にするかどうかを指定することができる var exp = Sql<DB>.Create(db => Condition(minEnable, 3000< db.tbl_remuneration.money) && Condition(maxEnable, db.tbl_remuneration.money < 4000) && db.tbl_staff.id == 1); var query = Sql<DB>.Create(db => Select(Asterisk(db.tbl_remuneration)). From(db.tbl_remuneration). Join(db.tbl_staff, db.tbl_remuneration.staff_id == db.tbl_staff.id). //特殊仕様で渡されたExpressionが空ならWhere句は消える。Havingも同様。 Where(exp)); //文字列化 Debug.Print(query.ToSqlInfo(typeof(SqlConnection)).SqlText); //Dapperを使っているなら、以下のように実行できます var datas = _connection.Query(query).ToList(); }
履歴
2016/09/02