Как работать с вложенным словарем C#?

Dictionary<int, Dictionary<int, string>> status = new Dictionary<int, Dictionary<int, string>>();
int count = 0;
int[] li = new int[] { 6, 77, 25, 18 }; //загружаемые из БД словари
foreach (int a in li)
{
    OdbcCommand command = new OdbcCommand($"select code,name from dict where parent_id={a}");
    using (OdbcConnection connection = new OdbcConnection("СТРОКА ПОДКЛЮЧЕНИЯ БД"))
    {
        command.Connection = connection;
        connection.Open();
        command.ExecuteNonQuery();
        using (OdbcDataReader reader = command.ExecuteReader())
        {
            //status.Add(count, status[count].Add(1,"2"));
        }
    }
    count++;
}

Загружаю 4 словаря и распихиваю их в status. Я вижу это так:

{
 {
  0,
    {
     {1,"фраза"},
     {2,"фраза"}
    },
 {
  1,
    {
     {1,"фраза"},
     {2,"фраза"}
    }
}

Как правильно реализовать метод Add при такой структуре? Как получить значение без использования цикла? К примеру мне необходимо получить значение из 1 словаря 2 фразу. Гугл молчит и не дает результатов.


Ответы (1 шт):

Автор решения: Alexander Petrov

Если я правильно понял, этот код даст желаемый результат.

var status = new Dictionary<int, Dictionary<int, string>>();
int[] li = new int[] { 6, 77, 25, 18 };

using (var command = new OdbcCommand("select code,name from dict where parent_id=?"))
using (var connection = new OdbcConnection(_connectionString))
{
    command.Connection = connection;
    connection.Open();

    var idParam = command.Parameters.Add("id", OdbcType.Int);

    for (int i = 0; i < li.Length; i++)
    {
        idParam.Value = li[i];

        using (var reader = command.ExecuteReader())
        {
            var dict = new Dictionary<int, string>();
            status.Add(i, dict);

            while (reader.Read())
            {
                var code = (int)reader["code"];
                var name = (string)reader["name"];

                dict.Add(code, name);
            }
        }
    }
}

Вы совершенно правильно обернули в using типы Connection и Reader. Но и Command нужно использовать аналогично.

Всегда используйте параметризованные запросы: это защитит от sql-инъекций и увеличит производительность.

Поле parent_id скорее всего имеет тип int. Если это не так, укажите правильный тип вместо OdbcType.Int.

При получении code и name из ридера тоже укажите правильные типы, если я их не угадал.
Можете использовать reader.GetInt32 и reader.GetString.

→ Ссылка