@alexeysikora

Как перевести массив и jsonb объект, возвращаемые функцией postgres, в список строк и словарь c#?

У меня есть функция, которая возвращает из базы данных столбцы таблицы, представленные типами text[] и jsonb:
CREATE OR REPLACE FUNCTION public.getValues(
    medicamentID uuid)
    RETURNS TABLE("Compound" text[], "DoseInstruction" jsonb)
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE PARALLEL UNSAFE
AS $BODY$
BEGIN
    RETURN QUERY SELECT "Medicaments"."Compound", "Medicaments"."DoseInstruction"
    FROM "Medicaments"
    WHERE "ID" = medicamentID;
END
$BODY$;


Я хочу сохранить результат этой функции в списке строк (List) и в словаре (Dictionary через Json.DeserializeObject). Написал такой код:
Npgsql.NpgsqlCommand pgcom1 = new Npgsql.NpgsqlCommand(@"getvalues", pgcon);
pgcom1.CommandType = CommandType.StoredProcedure;
pgcom1.Parameters.AddWithValue("medicamentid", Guid.Parse(MedicamentsID.Text));
Npgsql.NpgsqlDataReader pgreader1 = pgcom1.ExecuteReader();
List<string> compound = new List<string>();
Dictionary<string, string> doseInstruction = new Dictionary<string, string>(); 
if (pgreader1.Read())
{
    compound = (from IDataRecord r in pgreader1
                            select (string)r["Compound"]
                            ).ToList();
    doseInstruction = JsonConvert.DeserializeObject<Dictionary<string, string>>(pgreader1.GetString(1));
}
pgreader1.Close();
pgcon.Close();


И на строчке
doseInstruction = JsonConvert.DeserializeObject<Dictionary<string, string>>(pgreader1.GetString(1));

Компилятор выдаёт ошибку "No rows available".
Как правильно перевести массив и jsonb в типы c# (полученных именно как результат функции базы данных)? Искал в интернете часов 6, даже близко к ответу не приблизился, возможно некорректно ставил вопросы при поиске, но всё же...

Дополнение: Пробовал вызвать функцию в запроснике pgAdmin, результат выдавался корректно:
SELECT getValues('280ca185-3701-432f-86d0-1209db3f4123');
RESULT:
("{Препарат1,Препарат2}","{""Дети"": ""1"", ""Взрослые"": ""2""}")
  • Вопрос задан
  • 195 просмотров
Решения вопроса 1
Bobsans
@Bobsans
Full-Stack Developer
Там ошибка потому что ты уже все прочитал вот в этом месте:
(from IDataRecord r in pgreader1
    select (string)r["Compound"]
    ).ToList();

и взял оттуда только "Compound" а "DoseInstruction" улетело в никуда
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы