C#でSQL(Sqlite3)の交差テーブルの内容をList<T>として取得する

前回SQLを使って交差テーブル(中間テーブル・関連テーブル)の内容を列挙しましたが、今回はその問い合わせ結果をC#から呼び出してみたいと思います。

前回の記事で使用した以下のテーブル定義とデータは既にファイルに保存してあるものとします。

実施環境

  • Windows10
    • Sqlite3 ver.3.27.2
    • コマンドラインで確認
  • C# 7.2
    • VisualStudio2017
    • .NET Core2.2
    • nuget System.Data.SQLite.Core (ver.1.0.110)

交差テーブルからリストを取得

using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Data.SQLite;

internal class AppMain
{
    public static void Main(string[] args)
    {
        // こういう問い合わせ結果になるはずなので
        // 対応する型Userを用意する
        // user_id     name
        // ----------  ----------
        //      10000       太郎
        //      10001       一郎
        //      10002       次郎
        var userList = new List<User>();

        Context(CreateCon, cmd =>
        {
            // ブログIDが"1"のユーザーIDと名前を列挙する
            cmd.CommandText = "SELECT C.user_id, C.name " +
                                "FROM (blogs A INNER JOIN authors B ON A.blog_id = B.blog_id) " +
                                "INNER JOIN users C ON B.user_id = C.user_id " +
                                "WHERE A.blog_id = 1;";

            using (var r = cmd.ExecuteReader())
            {
                r.Read();
                while (r.Read())
                {
                    for (int i = 0; i < r.FieldCount; i++)
                    {
                        userList.Add(new User()
                        {
                            ID = r.GetFieldValue<long>(0),
                            Name = r.GetFieldValue<string>(1),
                        });

                    }
                }
            }
        });

        userList.ForEach(user => Console.WriteLine($"{user.ID}, {user.Name}"));
    }

    public static void Context(DbConnectionStringBuilder b, Action<SQLiteCommand> func)
    {
        using (var con = new SQLiteConnection(b.ToString()))
        {
            con.Open();
            using (var command = new SQLiteCommand(con))
            {
                func(command);
            }
        }
    }

    public static DbConnectionStringBuilder CreateCon => new SQLiteConnectionStringBuilder()
    {
        DataSource = @"C:\xxxx\sample.db"
    };
}

public class User
{
    public long ID { get; set; }
    public string Name { get; set; }
}

これでリストにデータが取得できました。

リストに値を追加するのは以下操作を行うだけなので割愛します。 * トランザクションをBeginTransaction()で開始 * users テーブルに新しいデータを INSERT INTO をExecuteNonQuery * authore テーブルに ↑ で追加したデータを INSERT INTO をExecuteNonQuery * 変更をTransaction.Commit()でコミット

簡単ですが以上です。