GitHub - Codeer-Software/LambdicSql
Whereです。
私の少ないSQL経験ではプログラムで動的にSQLを組み立てる場合、これが一番面倒でした。なので色々できるように工夫しました。
サブクエリ使えるようにできたときは、めっちゃテンション上がりましたw
操作対象はテーブルが二つあるDBです。
//テーブルが二つあるDB public class Staff { public int id { get; set; } public string name { get; set; } } public class Remuneration { public int id { get; set; } public int staff_id { get; set; } public DateTime payment_date { get; set; } public decimal money { get; set; } } public class Data { public Staff tbl_staff { get; set; } public Remuneration tbl_remuneration { get; set; } }
普通にWhere
まずは普通に。Whereの中では()つけたり&&とか||とかで条件を指定できます。
public void Where1() { var query = Sql<Data>.Create(db => Select(new Asterisk()). From(db.tbl_remuneration). //条件指定 Where(3000 < db.tbl_remuneration.money && db.tbl_remuneration.money < 4000)); //文字列化 Debug.Print(query.ToSqlInfo(typeof(SqlConnection)).SqlText); //Dapperを使っているなら、以下のように実行できます var datas = _connection.Query(query).ToList(); }
SELECT * FROM tbl_remuneration WHERE (((@p_0) < (tbl_remuneration.money)) AND ((tbl_remuneration.money) < (@p_1)));
変数で指定
条件は変数で指定することも可能です。
public void Where2() { //min,maxを変数で指定 decimal min = 3000; decimal max = 4000; var query = Sql<Data>.Create(db => Select(new Asterisk()). From(db.tbl_remuneration). //条件指定 Where(min < db.tbl_remuneration.money && db.tbl_remuneration.money < max)); //文字列化 Debug.Print(query.ToSqlInfo(typeof(SqlConnection)).SqlText); }
SELECT * FROM tbl_remuneration WHERE (((@p_0) < (tbl_remuneration.money)) AND ((tbl_remuneration.money) < (@p_1)));
可変の条件組み立て
Conditionメソッドにより、条件が簡単に組み立てられます。第一引数でその条件を有効か否かを指定できます。すべての条件が無効になったらWhere句は消えます。ORの組み立てとか()を付けたりするのはLinqよりも書きやすいと思います。
public void Where3(bool minCondition, bool maxCondition) { var query = Sql<Data>.Create(db => Select(new Asterisk()). From(db.tbl_remuneration). //条件指定 Where(Condition(true, 3000 < db.tbl_remuneration.money) || Condition(false, db.tbl_remuneration.money < 4000))); //文字列化 Debug.Print(query.ToSqlInfo(typeof(SqlConnection)).SqlText); //Dapperを使っているなら、以下のように実行できます var datas = _connection.Query(query).ToList(); }
SELECT * FROM tbl_remuneration WHERE ((@p_0) < (tbl_remuneration.money));
Between、Like、Inにも対応
public void Where6() { var query = Sql<Data>.Create(db => Select(new Asterisk()). From(db.tbl_remuneration). //条件指定 Where(Between(db.tbl_remuneration.money, 3000, 4000))); //文字列化 Debug.Print(query.ToSqlInfo(typeof(SqlConnection)).SqlText); //Dapperを使っているなら、以下のように実行できます var datas = _connection.Query(query).ToList(); }
SELECT * FROM tbl_remuneration WHERE (tbl_remuneration.money BETWEEN @p_0 AND @p_1);
public void Where7() { var query = Sql<Data>.Create(db => Select(new Asterisk()). From(db.tbl_staff). //条件指定 Where(Like(db.tbl_staff.name, "%e%"))); //文字列化 Debug.Print(query.ToSqlInfo(typeof(SqlConnection)).SqlText); }
SELECT * FROM tbl_staff WHERE (tbl_staff.name LIKE @p_0);
public void Where8() { var query = Sql<Data>.Create(db => Select(new Asterisk()). From(db.tbl_remuneration). //条件指定 Where(In(db.tbl_remuneration.money, 3000, 4000, 5000, 6000))); //文字列化 Debug.Print(query.ToSqlInfo(typeof(SqlConnection)).SqlText); //Dapperを使っているなら、以下のように実行できます var datas = _connection.Query(query).ToList(); }
SELECT * FROM tbl_remuneration WHERE (tbl_remuneration.money IN(@p_0, @p_1, @p_2, @p_3));
なんと!サブクエリ使えます。
In句をサブクエリで書けます。実はLambdicSQLはサブクエリに対応していて、ここだけではなく色んなところでサブクエリが使えます。また別の回で紹介します。
public void Where9() { //サブクエリ作成 var sub = Sql<Data>.Create(db => Select(new { money = db.tbl_remuneration.money }). From(db.tbl_remuneration). Join(db.tbl_staff, db.tbl_remuneration.staff_id == db.tbl_staff.id). Where(3000 < db.tbl_remuneration.money && db.tbl_remuneration.money < 4000)); //Inにサブクエリを入れる var query = Sql<Data>.Create(db => Select(new Asterisk()). From(db.tbl_remuneration). //条件指定 Where(In(db.tbl_remuneration.money, sub.Cast<int>()))); //文字列化 Debug.Print(query.ToSqlInfo(typeof(SqlConnection)).SqlText); //Dapperを使っているなら、以下のように実行できます var datas = _connection.Query(query).ToList(); }
SELECT * FROM tbl_remuneration WHERE tbl_remuneration.money IN( (SELECT tbl_remuneration.money AS money FROM tbl_remuneration JOIN tbl_staff ON (tbl_remuneration.staff_id) = (tbl_staff.id) WHERE ((@p_0) < (tbl_remuneration.money)) AND ((tbl_remuneration.money) < (@p_1))))
コード修正
2016/07/09 SQL修正 プリペアド対応
2016/07/24 SelectFromに変更、ToExecutorの引数変更
2016/09/02 β版