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

ささいなことですが。

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

LambdicSql - TableAttributeとColumnAttributeに対応しました。

LambdicSql_α0.0.53をリリースしました。
www.nuget.org

テーブル名とカラム名のルール

LambdicSqlのテーブル名とカラム名は、通常は変数名で表します。

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 DB
{
    //テーブル名も変数名で表す
    public Staff tbl_staff { get; set; }
    public Remuneration tbl_remuneration { get; set; }
}

スキーマを使う場合も変数名で表します。(もちろんスキーマを書く必要がない場合はこれは省略できます)

public class DBO
{
    public Staff tbl_staff { get; set; }
    public Remuneration tbl_remuneration { get; set; }
}
public class DB_EX
{
    //スキーマも変数名で表す
    public DBO dbo { get; set;}
}
//スキーマまで書きたい場合
var query = Sql<DB_EX>.Create(db =>
    Select(new
    {
        Name = db.dbo.tbl_staff.name,
        PaymentDate = db.dbo.tbl_remuneration.payment_date,
        Money = db.dbo.tbl_remuneration.money,
    }).
    From(db.dbo.tbl_remuneration).
        Join(db.dbo.tbl_staff, db.dbo.tbl_staff.id == db.dbo.tbl_remuneration.staff_id));

var info = query.ToSqlInfo(_connection.GetType());
Debug.Print(info.SqlText);
SELECT
	dbo.tbl_staff.name AS "Name",
	dbo.tbl_remuneration.payment_date AS "PaymentDate",
	dbo.tbl_remuneration.money AS "Money"
FROM dbo.tbl_remuneration
	JOIN dbo.tbl_staff ON (dbo.tbl_staff.id) = (dbo.tbl_remuneration.staff_id)

TableAttributeとColumnAttributeに対応しました。

それに加えてTableAttribute、ColumnAttributeでも名前を指定できるようにしました。
TableAttribute、ColumnAttributeは System.ComponentModel.DataAnnotations.dll に定義されている標準のものです。
テーブル名とか変数名をラムダ中で短く書きたい場合や、スキーマを一段クラスで表現するのが面倒な場合、それからテーブルやカラムの名前がC#の変数名で使えないものだったりする場合に利用できると思います。

//テーブル名をクラス定義時に指定できる
[Table("tbl_staff")]
public class StaffX
{
    //属性の方が優先される
    [Column("id")]
    public int idx { get; set; }
    [Column("name")]
    public string namex { get; set; }
}
public class DB
{
    //StaffXは属性でテーブル名を持っているのでそちらが優先される
    public StaffX xxx { get; set; }
    public Remuneration tbl_remuneration { get; set; }
}
var query = Db<DB>.Sql(db =>
    Select(new
    {
        name = db.xxx.namex,
        payment_date = db.tbl_remuneration.payment_date,
        money = db.tbl_remuneration.money,
    }).
    From(db.tbl_remuneration).
        Join(db.xxx, db.tbl_remuneration.staff_id == db.xxx.idx);

var info = query.Build(_connection.GetType());
Debug.Print(info.SqlText);
SELECT
	tbl_staff.name AS "name",
	tbl_remuneration.payment_date AS "payment_date",
	tbl_remuneration.money AS "money"
FROM tbl_remuneration
	JOIN tbl_staff ON (tbl_remuneration.staff_id) = (tbl_staff.id)