Soma 1.5.0.0 の新機能紹介

C#のコードで紹介します。

検索条件パラメータでIDictionary等の利用をサポート

これまでは、検索条件パラメータは匿名型のみをサポートしてました。

var empList = db.Query<Employee>(
    "select * from Employee e where e.DepartmentId = /* DepartmentId */0 and e.EmployeeName = /* EmployeeName */''", 
    new { DepartmentId = 1, EmployeeName = "Smith" });

1.5.0.0ではIDictionary型などもサポートしました。例えばHashtableを使えます。

var empList = db.Query<Employee>(
    "select * from Employee e where e.DepartmentId = /* DepartmentId */0 and e.EmployeeName = /* EmployeeName */''", 
    new Hashtable { { "DepartmentId", 1 }, { "EmployeeName", "Smith" } });

DbDataReaderのハンドリングのサポート

Somaは、DbDataReaderをPOCO、dynamic(dynamicはIDictionaryでもある)、タプルなどの型にマッピングできますが、場合によってはDbDataReaderを直接触りたいということもあるかと思います。そういったケースに対応できるようにしました。例えば、DbDataReaderをDataTableにロードできます。

DataTable table = db.ExecuteReader(
    reader =>
    {
        var t = new DataTable();
        t.Load(reader);
        return t;
    }, 
    "select * from Employee e where e.DepartmentId = /* DepartmentId */0 and e.EmployeeName = /* EmployeeName */''", 
    new {DepartmentId = 1, EmployeeName = "Smith"});

第一引数のFuncが返した値がそのままExecuteReaderメソッドの戻り値になります。

データバインディングのサポート

Queryメソッドなどの型パラメータにdynamicを指定した場合に、データバインディング可能なオブジェクトを返すようにしました。
たとえば、Window Formで次のようなコードを記述すると

var empList = db.Query<dynamic>("select * from Employee");
dataGridView1.DataSource = empList;

次のように表示されます。

プロトタイピングなどで楽だと思います。


今回のリリースにあたっては、http://soma.codeplex.com/discussions/269435 にてnikochan2kさんからいろいろとフィードバックをいただいた結果を反映させています。フィードバックありがとうございました。