Я пытаюсь выяснить, как использовать Dapper для передачи пользовательского составного типа в функцию PostgreSQL.Я знаю, что это возможно с SQL Server, и у меня уже есть рабочие примеры, использующие Dapper + SQL Server, однако я кратко расскажу, как сделать то же самое с PostgreSQL.
Из некоторых вещей, которые я прочитал, я не уверен, возможно ли это даже с Dapper + PostgreSQL, но я знаю, что он работает с простым Npgsql (и у меня есть рабочий примероб этом также).
Итак, как вызвать функцию PostgreSQL, которая принимает пользовательский составной тип, используя Dapper?
Пример пользовательского составного типа
CREATE TYPE hero AS (
first_name text,
last_name text
);
Пример функции PostgreSQL, которая принимает пользовательский составной тип
CREATE OR REPLACE FUNCTION testfuncthattakesinudt(our_hero hero)
RETURNS SETOF characters
LANGUAGE 'sql'
STABLE
ROWS 1000
AS $BODY$
SELECT *
FROM characters
WHERE first_name = COALESCE(our_hero.first_name, '')
AND last_name = COALESCE(our_hero.last_name, '');
$BODY$;
Теоретический пример C #
[Test]
public void UsingDapper_Query_CallFunctionThatTakesInUserDefinedCompositeType_FunctionUsesUserDefinedCompositeType()
{
// Arrange
using (var conn = new NpgsqlConnection(_getConnectionStringToDatabase()))
{
var funcName = "testfuncthattakesinudt";
var expect = CharacterTestData.First();
// Act
var result = conn.Query<Character>(funcName,
new
{
our_hero = new
{
first_name = CharacterTestData.First().first_name,
last_name = CharacterTestData.First().last_name
}
},
commandType: CommandType.StoredProcedure
);
// Assert
Assert.AreEqual(expect, result);
}
}
Я знаю, что с использованием простого Npgsql необходимо создатьпараметр примерно такой:
var udtCompositeParameter = new NpgsqlParameter
{
ParameterName = "our_hero",
Value = new
{
first_name = CharacterTestData.First().first_name,
last_name = CharacterTestData.First().last_name
},
DataTypeName = "hero"
};
Но с помощью Dapper я не нашел способа установить DataTypeName
или что-то подобное.Я пробовал много разных способов сформировать параметр для Dapper (например, используя что-то вроде DynamicParameter
и указав dbType: DbType.Object
), но независимо от этого, я всегда получаю некоторую похожую ошибку, связанную с составным типом.Я также посмотрел на Dapper source , но из того, что я увидел, он был легок для специфических тестов PostgreSQL, и те тесты, которые, казалось, соответствовали тому, что я пытаюсь сделать, были адаптированы для SQL Server..