ささいなことですが。

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

LambdicSql - 機能紹介 - Where

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 β版