Npgsql: column t.Value does not exist

Рейтинг: 0Ответов: 2Опубликовано: 11.08.2023

Я вызываю хранимую процедуру и получаю исключение

Npgsql.PostgresException: "42703: column t.Value does not exist POSITION: 8"

Объявление процедуры выглядит так:

CREATE OR REPLACE FUNCTION survey.get_survey(uid text, usrid integer)
 RETURNS text
 LANGUAGE sql
AS $function$

Я вызываю процедуру следующим образом:

string sql = "SELECT * FROM survey.get_survey({0}, {1})";
var data = Database.SqlQueryRaw<string>(sql, surveyId, userId).FirstOrDefaultAsync();

Проблема заключается в том, что не ясно, что это за такая колонка t.Value. Ведь в самой процедуре не используется ни одна колонка с таким названием.

В процедуре используются встроенные функции json_agg и json_build_object. Сама процедура 100% рабочая. Значит ошибка на моей стороне.

Вопрос: если кто-то знает, что может быть причиной исключения или у кого-то была подобная ошибка, напишите, пожалуйста, как вы ее решили. Заранее спасибо.

Ответы

▲ 0Принят

Решение:

string sql = "SELECT survey.get_survey({0}, {1})";
string jsonString = Database.SqlQueryRaw<string>(sql, surveyId, userId).AsEnumerable().FirstOrDefault();
▲ 1

Как сказано в документации:

You can also compose LINQ operators over your SQL query. However, since your SQL becomes a subquery whose output column needs to be referenced by the SQL EF adds, you must name the output column Value.

То есть, для того, чтобы к полученному IQueryable<> можно было дополнительно применить LINQ методы, нужно проецируемую колонку назвать Value.

Для Npgsql нужно ухищряться, потому что PostgreSQL по умолчанию приводит названия к нижнему регистру. Для этого название колонки нужно обернуть кавычками:

string sql = "SELECT * AS \"Value\"";