LambdicSql_α0.0.63をリリースしました。β版間近です!
www.nuget.org
マルチDB対応
なんと主要6DBで動作確認しています。Surfaceに全部インストールしましたが、意外と入るものですね。(SQLiteはインストール不要)
とは言え、同じ書き方でOKなわけではないです。
この辺がゆるふわ。LambdicSqlは基本はそのままSQLのテキストになります。つまり、普通にSQL書く時と同じように使える句や関数だけ使うという方針です。
public void TestWindow()
{
if (_connection.GetType().FullName == "System.Data.SQLite.SQLiteConnection") return;
if (_connection.GetType().FullName == "MySql.Data.MySqlClient.MySqlConnection") return;
var query = Db<DB>.Sql(db =>
Select(new SelectData()
{
Avg = Window.Avg(db.tbl_remuneration.money).
Over<decimal>(new PartitionBy(db.tbl_staff.name, db.tbl_remuneration.payment_date),
new OrderBy(new Asc(db.tbl_remuneration.money), new Desc(db.tbl_remuneration.payment_date)),
new Rows(1, 5)),
PaymentDate = db.tbl_remuneration.payment_date,
Money = db.tbl_remuneration.money,
}).
From(db.tbl_remuneration).
Join(db.tbl_staff, db.tbl_remuneration.staff_id == db.tbl_staff.id));
var info = query.Build(_connection.GetType());
Debug.Print(info.SqlText);
var datas = _connection.Query<SelectData>(info.SqlText, info.Params).ToList();
}
オプションで、以下を切り替えれるようにしました。
じゃあ、何がマルチDB対応なんだよってことなのですが、以下の二つだけオプションで切り替えれるようにしています。こればっかりは書き分けられないので・・・。
[TestMethod]
public void Test()
{
var query = Db<DB>.Sql(db =>
Select(new
{
Name = db.tbl_staff.name + "★",
Money = db.tbl_remuneration.money,
}).
From(db.tbl_remuneration).
Join(db.tbl_staff, db.tbl_staff.id == db.tbl_remuneration.staff_id).
Where(1000000 < db.tbl_remuneration.money));
var info = query.Build(new SqlConvertOption() { ParameterPrefix = ":", StringAddOperator = "||" });
Debug.Print(info.SqlText);
}
SELECT
(tbl_staff.name) || (:p_0) AS Name,
tbl_remuneration.money AS Money
FROM tbl_remuneration
JOIN tbl_staff ON (tbl_staff.id) = (tbl_remuneration.staff_id)
WHERE (:p_1) < (tbl_remuneration.money)
なんで、こんなとこに差だすかなー。オラクルで@使ったらダメとか、わからなくて結構悩みました。
これを毎回指定するのは面倒なんで、コネクション(SqlConnectionとか)のタイプを渡すと最適なオプションを選択するようにしています。
var info = query.ToSqlInfo(connection.GetType());
同一の記法でSQLテキストをカスタマイズする方法も提供しています。
長くなるので端折りますが、ToSqlInfoの第三引数にテキスト出力をカスタマイズするインターフェイスを渡せるようにしています。どうしてもやりたい人はこちらでできるように。また句や関数を自分で増やせる手段も提供しています。(拡張オレオレ句も作れる)
public static SqlInfo ToSqlInfo(this ISqlExpression exp, SqlConvertOption option, ISqlSyntaxCustomizer customizer)