Хранимые процедуры Dapper с Postgresql без алфавитных параметров

Я пытаюсь вызвать хранимую процедуру Postgresql, написанную на plpgsql, с использованием C # и Dapper, но я обнаружил, что Dapper упорядочивает параметры по алфавиту, прежде чем вставлять их в хранимую процедуру. Есть ли способ избежать такого поведения и вставить элементы в правильном порядке?

Например, следующий вызов не будет выполняться правильно, потому что он будет располагать имена параметров в алфавитном порядке. Мне нужно вручную расположить их в алфавитном порядке, чтобы звонок прошел.

int map_id = conn.Query<int>(
"insert_color",
new
{
    zebra_name = new DbString { Value = slide_name },
    door_name = new DbString { Value = fov_name },
    foo_number = cycle_number,
    variable_path = new DbString { Value = image_path },
    random_path = new DbString { Value = meta_path },
    x = x,
    y = y,
    z = z,
    exposure = exposure,
    type_name = new DbString { Value = image_type },
    copy = copy
},
commandType: CommandType.StoredProcedure).First();

Вот объявление хранимой процедуры:

CREATE OR REPLACE FUNCTION insert_color(
zebra_name text, door_name text, foo_number integer,    
variable_path text, random_path text, 
x real, y real, z real, exposure real,
type_nametext, copy integer) RETURNS integer AS $$
    ...
$$ LANGUAGE plpgsql;

person CookieOfFortune    schedule 31.07.2012    source источник
comment
Что вы имеете в виду под алфавитом?   -  person Richard Huxton    schedule 31.07.2012
comment
Это означает, что вместо того, чтобы отправлять параметры функции по порядку (сначала имя зебры, затем имя_двери и т. Д.), Она отправляет их в алфавитном порядке (сначала копия, имя_ двери, экспозиция и т. Д.). Мне нужно добавить a_, b_, c_ перед именами параметров, чтобы функция работала правильно.   -  person CookieOfFortune    schedule 01.08.2012
comment
Ну, в таком случае, какой бы щеголеватый ни был, он сломан. Все, что сломано, я бы просто перестал использовать, но вы можете попробовать сообщить об ошибке. Конечно, если он не может вызывать функции, он, вероятно, не справится с массивами, типами записей, tsearch, postgis, ...   -  person Richard Huxton    schedule 01.08.2012
comment
Dapper был написан людьми @ SO ...   -  person Master Morality    schedule 01.08.2012
comment
Честно говоря, на меня это не особо повлияло, так как я могу вручную расположить по алфавиту, это просто раздражает.   -  person CookieOfFortune    schedule 01.08.2012


Ответы (1)


Внутри Dapper использует отражение для получения свойств объекта param. В частности, GetProperies(...) проблема в том, что они не обязательно находятся в определенном порядке ...

Метод GetProperties не возвращает свойства в определенном порядке, например в алфавитном порядке или в порядке объявления. Ваш код не должен зависеть от порядка, в котором возвращаются свойства, поскольку этот порядок может быть разным.

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

person Master Morality    schedule 31.07.2012
comment
Это не синтаксис именованных параметров в PostgreSQL, о чем конкретно идет речь. Я не уверен, как вы можете заставить Dapper использовать соглашение об именованных параметрах, но синтаксис на стороне PostgreSQL описан здесь: postgresql.org/docs/9.1/interactive/ - person kgrittn; 01.08.2012
comment
@kgrittn, вы правы. Я быстро поискал в Google синтаксис postgresql и нашел страницу с вызовом сохраненной процедуры, я думаю, это все-таки не postgresql. Я удалил бит кода. - person Master Morality; 01.08.2012