読者です 読者をやめる 読者になる 読者になる

ささいなことですが。

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

LambdicSql - TODO 今後の改善ポイント

LambdicSql C#

GitHub - Codeer-Software/LambdicSql

私のSQL力の低さを補うべく、SQLServerのMVPのおださんに、色々教えてもらいました。(えらい初心者向けのことから)いや、このシリーズの初回にも書きましたが、本当にSQLはほとんど書いたことがなかったのです。組み込みとか、それを制御するPCアプリがメインだったので・・・。

それで、達人から見たLambdicSqlの改善点などもご指摘いただきました。さらにヘッドハンティングにも成功し、開発メンバに加わっていただきました。今後も総監督的立場から色々ご指導いただきます。あわよくば開発もw

プリペアド使わなきゃ

2016/07/09 α0.0.12で対応完了
まず、何をおいてもこれは対応しなければってことでした。基本らしいです。すみません。例えば、文字列とかそのまま出してたんだけど、それをやると文字列にSQL構文いれられたときにヤバいことになる。これがかの有名なSQLインジェクションだったのか。

public void Test()
{
    var target = "ishikawa";

    var query = Sql.Query<Using2>().Select().
    From(db => db.tbl_staff).

    //変数で来たものを条件に入れる
    Where(db => db.tbl_staff.name == target);

    //実行
    var datas = query.ToExecutor(TestEnvironment.Adapter).Read();
}
SELECT
	tbl_staff.id,
	tbl_staff.name
FROM
	tbl_staff
WHERE
	/*SQLにリテラルいれちゃダメよ*/
	((tbl_staff.name) = ('ishikawa'));

DISTINCTの構文が違和感あり

2016/07/24 α0.0.36で対応完了
いや、これは僕のDISTINCTの理解が間違ってたんです。サポートしたものの実際に使ったことはなかったのでw。DISTINCT指定した列だけを一意にしてくれるのかと思ってましたが、Selectしたすべての列が完全に同じものを省くというものだったんですね。

public void Distinct()
{
    var datas = Sql.Query<DB>().
        Select(db => new
        {
            //この仕様は変
            id = Sql.Word.Distinct(db.tbl_remuneration.staff_id)
        }).
        From(db => db.tbl_remuneration).
        ToExecutor(new SqlServerAdapter(ConnectionString)).Read();
}
```sql
SELECT
	DISTINCT tbl_remuneration.staff_id AS "staff_id",
	/*これじつは↑だけじゃなくて↓にもかかっている*/
	tbl_remuneration.money AS "money"
FROM
	tbl_remuneration;

SQL玄人はCase式を使う

2016/07/29 α0.0.39で対応完了
そうなんだー。むしろCaseは「データとってきてからアプリで加工すればいいかなー」とか思ってて、実装しない予定でした。でもそういうことなら頑張って実装しますよー。

Whereの組み立てをもっと便利に

2016/07/24 α0.0.38で対応完了
やっぱり、これ系のライブラリに期待することはWhereの書きやすさのようです。逆に言えば、それ以外はテキストでも問題ないかなーとのこと。了解です。そこをもっと改善します。

クエリを組み合わせやすくした方がいい

2016/07/31 α0.0.40で対応完了
今もある程度はできますが、ここをもっと自由に便利にできた方がいいとのこと。確かにSQL構文を部品化して型安全に組み立てることができたら便利ですよね!この辺の話など参考になるようです。
http://www.slideshare.net/kwatch/sqlor

コネクションは使いまわしたい

2016/0723 α0.0.34で対応完了。
今の仕様では、内部的にコネクションの開閉をやってるんですよね。それで便利な場合もありますが、トランザクションの場合などは一つのコネクションを使いまわしたいとのこと。なるほどねー。

ウィンドウ関数欲しい

おー、やっぱウィンドウ関数もいるんだ。了解っす。勉強して追加しておきます。

Dapperは速いよ

->高速化中。
ishikawa-tatsuya.hatenablog.com
そこに関してはLambdicSqlも、式木から生成メソッドをコンパイルしてキャッシュしているから、良い線いけるんじゃないかなー。まあ計測してみよっと。

ツール欲しい

クラス書くのメンドイ。まあ、大規模になればそうですよねー。DBのスキーマからクラス作るツールをVS拡張でつくろうかな。

ありがとうございました!

おださん、今日は長い時間ありがとうございました。今後ともよろしくっす!