はじめに

基本編にて、ModelLoader.From(Of T)メソッドがある程度理解された方向けのドキュメントです。

事前準備

リレーションのサンプルをゼロから作るのは大変ですので、Kairyuのソースコードをダウンロードし、「samples」フォルダにある「Kairyu.SamplesModel」プロジェクトを使用することとします。
  • ソースコードは「DOWNLOADS」から入手できます。

なお、今回使用するモデルは以下の通り。

PrefectureGroup.vb
Public Class PrefectureGroup
    Public Property PrefectureGroupID As Integer
    Public Property PrefectureGroupName As String
    Public Property Prefectures As ICollection(Of Prefecture)
End Class
Prefecture.vb
Public Class Prefecture
    Public Property PrefectureID As Integer
    Public Property PrefectureGroup As PrefectureGroup
    Public Property PrefectureName As String
End Class
  • 本サンプルに直接関係のないコードは削除しています。

このコードが意味するリレーションは以下の通り。
  • PrefectureGroupは複数(0..N)のPrefectureを持つ。
  • Prefectureは必ず1つのPrefectureGroupを持つ。

また、データは以下のとおり。
PrefectureGroupID PrefectureGroupName
1
2
3
4


PrefectureID PrefectureName PrefectureGroupID
1 北海道 2
省略
47 沖縄県 4
  • マスタデータの全情報は「Kairyu.SamplesModel」プロジェクトの「PrefectureMasterFactory」クラスを参照ください。

Fromメソッドの仕様

今までの記述方法を元に、PrefectureGroupID=4(県)のデータを読み込んでみましょう。

Imports Kairyu.Load
・・・
Dim m = DB.Connect(Function(r) r.From(Of PrefectureGroup).WhereKeyEquals(4).ToList)
生成されるSQL
SELECT
T0.PrefectureGroupID AS T0_0, T0.PrefectureGroupName AS T0_1
FROM 
PrefectureGroups T0 
WHERE 
T0.PrefectureGroupID = 4
  • ORMのコードを記述するときは、拡張メソッドを使用するために「Kairyu.Load」をインポートしておいてください。以降のサンプルコードではImports文を省略していますので、注意してください。

標準ではPrefecturesテーブルへのアクセスが発生しません。
  • このときの m.Prefectures はORMの対象になっていないため、初期値(通常はNothing)のままになっています。

下層を読み込む

下層を読み込むには、LoadChildメソッドを使用して読み込みを明示してやる必要があります。
Dim m = DB.Connect(Function(r) r.From(Of PrefectureGroup).WhereKeyEquals(4).Execute.LoadChild(Of Prefecture).ToList)
生成されるSQL
SELECT 
T0.PrefectureGroupID AS T0_0, T0.PrefectureGroupName AS T0_1 
FROM 
PrefectureGroups T0 
WHERE 
T0.PrefectureGroupID = 4
/
SELECT 
T0.PrefectureID AS T0_0, T0.PrefectureName AS T0_1, T0.PrefectureGroupID AS T0_2 
FROM 
Prefectures T0 
WHERE 
T0.PrefectureGroupID = 4

ポイント

  • 読み込んだモデルを元に追加でORMを実行するには、ToList(ToItem)メソッドではなく、Executeメソッドを使用してください。
  • Executeメソッドを使用すると一度DBへアクセスが発生し、ORMが起きます。
  • Executeメソッド後の追加処理として、LoadChild(Of T)メソッドを指定。子プロパティタイプがTのものを追加読み込みします。
  • LoadChild(Of T)メソッドの後は、ToList(ToItem)メソッドを使用して値を取得してください。

下層のさらに下層を読み込むには?

1階層までしか読み込めないので、読み込んだデータの下層をルートにして、再度Fromメソッドを走らせないといけません。
  • 改良予定です。

Last edited Mar 11, 2013 at 1:53 PM by mk3008, version 6

Comments

No comments yet.