簡易ORMフレームワークを作成してみる(16)

SQL文の実行

前述のドメインモデルを利用して今回作成したORMでどのようなSQL文が実行されるか見てみます。
ついでに検索ポリシーなどを利用してデータアクセスを最適化して、いろいろ考えてみたいと思います。

テストするシナリオは、セット商品の料金を算出するシナリオです。

[Test]
public void 商品価格セット追加料金()
{
	商品DataSet Schema = new 商品DataSet();
	DataSetDataAdapter da = new SqlDataSetDataAdapter(Schema.商品);

	QueryObject qo = new QueryObject();
	qo.Filter = qo.In("商品名", "ビッグマ○クセット");

	商品DataSet model = new 商品DataSet();
	da.Fill(model, qo); 

	商品DataSet.商品Row item = model.FindBy商品名("ビッグマ○クセット");
	List<商品DataSet.商品Row> optinList = new List<商品DataSet.商品Row>();
	optinList.Add(model.FindBy商品名("ビッグマ○ク"));
	optinList.Add(model.FindBy商品名("コーラM"));
	optinList.Add(model.FindBy商品名("ポテトL"));
	Assert.AreEqual(610, item.単価取得(optinList));

}

まずは何も指定しない場合、全てのリレーションを探索しテーブル検索のSELECT文を繰り返します。リレーションがループしていなければテーブルの数だけのSelect文の実行で済むのですが、今回リレーションがループしていることもあり多くのSelect文が発行されています。
ビッグマ○クセットを元に構成商品やグループ商品の関連をたどって関連して検索された商品は以下のようになりました。


最終的に実行されたSelect文は21回です。

Select [商品ID],[商品名],[タイプ],[単体価格],[サイズ]
	From [商品]  Where [商品名] In ('ビッグマ○クセット')
Select [グループ商品ID],[アイテム商品ID]
	From [グループ商品構造] Where (([グループ商品ID] = '2'))
Select [商品ID],[構成商品ID],[アイテム名],[追加価格],[単体商品_構成商品ID]
	From [単体商品_構成商品] Where (([商品ID] = '2'))
Select [商品ID],[商品名],[タイプ],[単体価格],[サイズ] From [商品]
	Where (([商品ID] = '6')) Or (([商品ID] = '5')) Or (([商品ID] = '7'))
	Or (([商品ID] = '9')) Or (([商品ID] = '13'))
Select [グループ商品ID],[アイテム商品ID] From [グループ商品構造]
	Where (([グループ商品ID] = '13')) Or (([グループ商品ID] = '5'))
	Or (([グループ商品ID] = '6')) Or (([グループ商品ID] = '7'))
	Or (([グループ商品ID] = '9'))
Select [商品ID],[商品名],[タイプ],[単体価格],[サイズ] From [商品] Where ....
Select [グループ商品ID],[アイテム商品ID] From [グループ商品構造] Where  ....
Select [商品ID],[構成商品ID],[アイテム名],[追加価格],[単体商品_構成商品 ....
Select [商品ID],[構成商品ID],[アイテム名],[追加価格],[単体商品_構成商品 ....
Select [商品ID],[構成商品ID],[アイテム名],[追加価格],[単体商品_構成商品 ....
Select [商品ID],[商品名],[タイプ],[単体価格],[サイズ] From [商品] Where ....
Select [グループ商品ID],[アイテム商品ID] From [グループ商品構造] Where  ....
Select [商品ID],[商品名],[タイプ],[単体価格],[サイズ] From [商品] Where ....
Select [グループ商品ID],[アイテム商品ID] From [グループ商品構造] Where  ....
Select [商品ID],[構成商品ID],[アイテム名],[追加価格],[単体商品_構成商品 ....
Select [商品ID],[構成商品ID],[アイテム名],[追加価格],[単体商品_構成商品 ....
Select [商品ID],[構成商品ID],[アイテム名],[追加価格],[単体商品_構成商品 ....
Select [グループ商品ID],[アイテム商品ID] From [グループ商品構造] Where  ....
Select [グループ商品ID],[アイテム商品ID] From [グループ商品構造] Where  ....
Select [商品ID],[構成商品ID],[アイテム名],[追加価格],[単体商品_構成商品 ....
Select [グループ商品ID],[アイテム商品ID] From [グループ商品構造] Where  ....