Soma.Core.DbクラスのQueryOnDemandメソッド

もうひとつ紹介。
QueryOnDemandメソッドは、SQLの実行を遅延し、さらにDbDataReaderを読みながら一件一件結果を返します。大量データを扱うときに便利です。たとえば、Employeeテーブルから全件取得する次のようなコードを見てみます。

var db = new Db(new MyConfig());
var empCollection = db.QueryOnDemand<Employee>(@"select * from Employee");
var i = 0;
foreach (var e in empCollection)
{
	Console.WriteLine(e);
	i++;
	if (i == 5)
	{
		break;
	}
}

SQLが発行されるのは、遅延されてforeachで処理するときに行われます。そして、Employeeテーブルに1000件分のデータがあっても、最初の5件分しかDbDataReaderはリードされません。つまり、Employeeクラスのインスタンス化は最初の5回だけですみます。
これが、QueryOnDemandメソッドの機能です。

LINQ to SQLやEntity Frameworkではデフォルトでそのような動きになると思うのでそちらに慣れている人には驚きはないと思いますが、この機能はSomaのアピールポイントの一つです。ただ、この挙動しかないといろいろとはまりやすいので、もっとわかりやすい名前のQueryメソッドでは、メソッド実行時にSQLを発行し1000件分のEmployeeクラスのインスタンス化を即座に実行するようにしています。

ちなみに、F#からSomaを使うときはDbモジュールのqueryOnDemand関数が同じ役割を果たします。
http://soma.codeplex.com/