Dapper - Как отобразить Resultset из столбца Resultset функции A Postgres в свойство класса - PullRequest
0 голосов
/ 24 февраля 2020

Я пытаюсь узнать, как использовать C# с dapper, в основном для вызова функции postgreSQL. Я пытаюсь сопоставить столбец в наборе результатов со свойством класса.

Мой класс определяется как:

public class CourseUnit
{
   public int unitId { get; set; }
   public string description { get; set; }
}

Хранимая процедура вызывается, как показано в черновом списке ниже. Набор результатов хранимой процедуры содержит два столбца:

  1. UnitID
  2. UnitName

У меня возникают проблемы с отображением UnitName из хранимой процедуры в свойство description моего класса , Код вызывает процедуру и создает набор результатов со значениями для UnitID, но значения описания равны нулю. Как мне сопоставить UnitName со свойством description моего класса?

public async Task<IEnumerable<CourseUnit>> GetCourseUnitsAsync(int courseId)
{
    using (var connection = new NpgsqlConnection(_connectionString))
    {
        connection.Open();

        Console.WriteLine($"About to execute the course units query for course {courseId}");

        try 
        {
            var p = new DynamicParameters();
            p.Add("@course_id", courseId);
            var result = await connection.QueryAsync<CourseUnit>(@"coursemanagement.select_course_units",
            p,
            commandType: CommandType.StoredProcedure);
            Console.WriteLine($"Total results of course units are {result.AsList().Count}");
            return result;
        }
        catch(Exception)
        {
            throw new KeyNotFoundException($"No Units found for course {courseId}");
        }

        throw new KeyNotFoundException();
    }
}

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

var result = await connection.QueryAsync<CourseUnit>(@"SELECT 'UnitID' as unitid, 'UnitName' as description FROM coursemanagement.select_course_units",
    new { courseId });
Console.WriteLine($"Total results of course units are {result.AsList().Count}");
return result;

Однако я получил исключение =>

Exception encountered while retrieving course units 42P01: relation "coursemanagement.select_course_units" does not exist

Ответы [ 2 ]

1 голос
/ 25 февраля 2020

Я пошел за обновлением хранимой процедуры, чтобы ввести псевдоним столбца с тем же именем, что и у свойства класса POCO.

Я включил ссылку на следующий стекопоток ресурс , который подробно описывает другие Возможности:

  • В этой записи предлагается использовать динамический запрос c с LINQ для отображения между набором результатов и классом POCO.
  • Использование настраиваемого свойства Dapper для отображения типов как подробно здесь

PostgreSQL позволяет результирующему набору функции запрашивать , например,

SELECT UnitID, UnitName from myStoredProc(parameterValue);

При использовании * Затем 1027 * может использовать класс ExecuteReader для запуска необработанного кода SQL для выбора из хранимой процедуры и подготовки DataTable, но не идеально.

0 голосов
/ 24 февраля 2020

Похоже, проблема не в именах столбцов, а в имени таблицы, которую вы используете. В вашем примере предполагается, что база данных coursemanagement , а таблица select_course_units ? Это правильно, также обычно может быть промежуточная схема, обычно dbo, поэтому может потребоваться использовать coursemanagement.dbo.select_course_units или coursemanagement..select_course_units , чтобы получить данные из таблицы правильно

...