投稿者 魔界の仮面弁士  (社会人) 投稿日時 2023/2/27 16:26:54
> テーブルやクラス、プロパティの関係性は
> A:B(α:β) = 1:n
> B:C(β:γ) = 1:n
> という状態です

こういう階層イメージでしょうか?
Class α
    Public Property Identity As Integer 'αの主キー 
    Public Property MemberOfAlpha As String 'αのメンバー 
    Public Property Children As List(Of β)
End Class
Class β
    Public Property Identity As Integer 'βの主キー 
    Public Property MemberOfBeta As String 'βのメンバー 
    Public Property Children As List(Of γ)
End Class
Class γ
    Public Property Identity As Integer 'γの主キー 
    Public Property MemberOfGamma As String 'γのメンバー 
End Class



> 果たしてこのやり方がパフォーマンス的にベストなのか疑問に思いながらコーディングしていました
一括挿入なら、Dapper Plus で Bulk Insert するという手がありますね。
https://dapper-plus.net/pricing


> この方法について皆さんはどう思われますか?
XML 化がボトルネックになりそうな気もするので、
SelectMany を用いて、各テーブル向けにフラット化して渡すようにするとか…。
(ストアド実行ではなくなってしまいますが)

connection.Execute(queryInsertAlpha, listOfAlpha)

connection.Execute(queryInsertBeta, listOfAlpha.SelectMany(Function(a) a.Children.Select(
  Function(b) New With {
      Key .aID = a.Identity,
      Key .bID = b.Identity,
      b.MemberOfBeta
  }))
)

connection.Execute(queryInsertGamma, listOfAlpha.SelectMany(Function(a) a.Children.SelectMany(Function(b) b.Children.Select(
  Function(g) New With {
      Key .aID = a.Identity,
      Key .bID = b.Identity,
      Key .gID = g.Identity,
      g.MemberOfGamma
  })))
)