SQLiteで構造体リストをそのままinsertしたい


Unityで開発を行っております。

[code]

    create table hoge_view( hoge_id1 integer, hoge_id2 integer, hoge_id3 integer, hoge_id4 integer, hoge_id5 integer );
    
[/code]

といったテーブルを作成しました。  
こちらのテーブルに下記の構造体リストの値をインサートしたいと考えております。

[code]

    public class HogeData
    {
        public List<HogeValue>  value;
    }
    
    [Serializable]
    public class HogeValue
    {
        public int  hoge_id1;
        public int  hoge_id2;
        public int  hoge_id3;
        public int  hoge_id4;
        public int  hoge_id5;
    }
    
[/code]

こちらリスト数が4万ほどになる場合があり、insertコマンドをその分呼び出すのに大変時間が掛かります。  
リストをそのままinsertすることは可能なのでしょうか

何かアドバイスいただけたらと思います。  
よろしくお願い致します。




[一括挿入](https://docs.microsoft.com/ja-jp/dotnet/standard/data/sqlite/bulk-
insert)によると

> SQLite には、データを一括挿入するための特別な方法はありません。 データの挿入または更新時に最適なパフォーマンスを得るには、以下を行ってください。
>
>   * トランザクションの使用。
>   * 同じパラメーター化コマンドの再利用。 後続の実行で、最初の実行のコンパイルを再利用します。
>

と案内されています。

マシン環境が異なるので所要時間が異なりますが、

  * takemori_kondoさんのコード： 402ms
  * 一括挿入： 230ms
  * 一括挿入から`tran`をコメントアウト： 243,755ms

と愚直にループしてもかなり高速になります。

[code]

    #if false
        foreach (var group in list.Select((hv, i) => (hv, i)).GroupBy(x => x.i / 1000))
        {
            using var cmd = conn.CreateCommand();
            var values = String.Join(", ", group.Select(x => $"({x.hv.hoge_id1}, {x.hv.hoge_id2}, {x.hv.hoge_id3}, {x.hv.hoge_id4}, {x.hv.hoge_id5})"));
            cmd.CommandText = $"insert into hoge_view values {values};";
            cmd.ExecuteNonQuery();
        }
    #else
        using (var tran = conn.BeginTransaction())
        using (var cmd = conn.CreateCommand())
        {
            cmd.CommandText = "insert into hoge_view values ($hoge_id1, $hoge_id2, $hoge_id3, $hoge_id4, $hoge_id5);";
            var hoge_id1 = cmd.CreateParameter(); hoge_id1.ParameterName = nameof(hoge_id1); cmd.Parameters.Add(hoge_id1);
            var hoge_id2 = cmd.CreateParameter(); hoge_id2.ParameterName = nameof(hoge_id2); cmd.Parameters.Add(hoge_id2);
            var hoge_id3 = cmd.CreateParameter(); hoge_id3.ParameterName = nameof(hoge_id3); cmd.Parameters.Add(hoge_id3);
            var hoge_id4 = cmd.CreateParameter(); hoge_id4.ParameterName = nameof(hoge_id4); cmd.Parameters.Add(hoge_id4);
            var hoge_id5 = cmd.CreateParameter(); hoge_id5.ParameterName = nameof(hoge_id5); cmd.Parameters.Add(hoge_id5);
            foreach (var hv in list)
            {
                hoge_id1.Value = hv.hoge_id1;
                hoge_id2.Value = hv.hoge_id2;
                hoge_id3.Value = hv.hoge_id3;
                hoge_id4.Value = hv.hoge_id4;
                hoge_id5.Value = hv.hoge_id5;
                cmd.ExecuteNonQuery();
            }
            tran.Commit();
        }
    #endif
    
    
[/code]

