これまでは、ActiveRecordを利用して1件のデータを操作する方法を見てきました。ここからは、複数件のデータを取得する方法について紹介していきます。

複数件のデータの取得

複数件のデータを取得するにはQueryメソッドを利用します。このメソッドを呼び出すとSQL情報を保持するQueryクラスを取得できます。

Queryメソッドで書籍テーブルの全データを取得

//全件データの取得(IDataReader形式) GridView1.DataSource = 書籍.Query().ExecuteReader(); GridView1.DataBind(); //全件データの取得(DataSet形式) GridView2.DataSource = 書籍.Query().ExecuteDataSet(); GridView2.DataBind();

上のコードでは、書籍テーブルのデータを全件取得しています。メソッドを使い分けることで、IDataReaderかDataSetのどちらかの形式でデータを取得することができます。

WHERE条件の追加

QueryクラスではWHEREメソッドを呼び出して、条件を追加することができます。 以下のコードでは、書籍の値段が3000円のデータを取得しています。

QueryクラスにWHERE条件を追加

//(1)引数1つ GridView1.DataSource = 書籍.Query() .WHERE("価格 = 3000").ExecuteReader(); //(2)引数2つ GridView2.DataSource = 書籍.Query() .WHERE(書籍.Columns.価格, 3000).ExecuteReader(); //(3)引数3つ GridView3.DataSource = 書籍.Query() .WHERE(書籍.Columns.価格, Comparison.Equals, 3000).ExecuteReader();

3つとも同じ結果のデータを取得していますが、WHEREメソッドの呼び出し方が少しずつ違います。

(1)のケースでは、文字列で条件を指定しています。複雑な条件をプログラムで組み立てたい場合に利用できます。

(2)のケースでは、第1引数に列名、第2引数に値を設定しています。条件がイコール(=)の場合に利用できます。「書籍.Columns.価格」の部分は「"価格"」と文字列で指定しても同じですが、列名が変わった時にコンパイルエラーにならないので、本稿ではColumnsプロパティの列名を使用しています。

(3)のケースでは、第1引数に列名、第2引数に比較演算子(SubSonic.Comparison列挙型)、第3引数に値を設定しています。 Comparison列挙型には、SQLと同じキーワードが定義されていますので、実行したいSQLの条件に応じた値を設定すると良いでしょう。

SubSonic.Comparison列挙型の値とSQLの対応表

名前 変換されるSQL演算子
Equals =
NotEquals <>
Like LIKE
NotLike NOT LIKE
GreaterThan >
GreaterOrEquals >=
LessThan <
LessOrEquals <=
Blank 半角スペース
Is IS
IsNot IS NOT
In IN
NotIn NOT IN

様々な条件の追加

続けて、複数の条件を追加する例を見てみましょう。 QueryクラスにはWHEREメソッド以外にも、AND、OR、BETWEEN VALUES、ORDER BYといったSQL構文と同じ名前のメソッドが用意されています。 以下のコードは、書籍テーブルで「値段が3000円か5000円」「名前が入門で終わっている」「出版社IDがnullでない」「発売日が2008年」という条件のデータを、発売日の並び順で取得しています。

Queryクラスに複数の条件を追加

//(1)メソッドを繰り返して条件を追加 GridView1.DataSource = 書籍.Query() .WHERE(書籍.Columns.価格, Comparison.In, new object[] {3000,5000}) .AND(書籍.Columns.名前, Comparison.Like, "%入門") .AND(書籍.Columns.出版社ID,Comparison.IsNot,null) .BETWEEN_VALUES(書籍.Columns.発売日,"2008/01/01","2008/12/31") .ORDER_BY(書籍.Columns.発売日, "ASC") .ExecuteReader(); //(2)Queryクラスの変数を宣言して条件を追加 Query q = 書籍.Query(); q.WHERE(書籍.Columns.価格, Comparison.In, new object[] {3000,5000}); q.AND(書籍.Columns.名前, Comparison.Like, "%入門"); q.AND(書籍.Columns.出版社ID, Comparison.IsNot, null); q.BETWEEN_VALUES(書籍.Columns.発売日, "2008/01/01", "2008/12/31"); q.ORDER_BY(書籍.Columns.発売日, "ASC"); GridView2.DataSource = q.ExecuteReader();

(1)では、1つの行でメソッドをつなげて条件を追加しています。(2)では、Queryクラスを変数として定義しています。どちらも同じSQLを実行しますので、好みに応じて使い分けてください。