これまでは、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を実行しますので、好みに応じて使い分けてください。