Ich versuche, eine Postgresql gespeicherte Prozedur in Plpgsql mit C # und Dapper, aber ich habe festgestellt, dass Dapper die Parameter vor dem Einfügen in die gespeicherte Prozedur alphabetisch sortiert. Gibt es eine Möglichkeit, dieses Verhalten zu vermeiden und die Artikel in der richtigen Reihenfolge einfügen zu lassen?
Der folgende Aufruf würde beispielsweise nicht korrekt ausgeführt, da die Parameternamen alphabetisch sortiert würden. Ich muss sie manuell alphabetisch sortieren, damit der Anruf durchgeht.
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();
Hier ist die Deklaration der gespeicherten Prozedur:
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;
Intern verwendet Dapper Reflection, um die Eigenschaften des param-Objekts zu erhalten. Insbesondere ist GetProperies(...)
, die nicht in einer bestimmten Reihenfolge garantiert sind ...
Die GetProperties-Methode gibt keine Eigenschaften in einer bestimmten Reihenfolge zurück, z. B. in alphabetischer Reihenfolge oder in der Reihenfolge der Deklarationen. Ihr Code darf nicht von der Reihenfolge abhängen, in der die Eigenschaften zurückgegeben werden, da diese Reihenfolge variiert.
Um etwas nützlich zu sein, haben sie sich entschieden, die Parameter alphabetisch zu sortieren, aber leider gibt es keine Möglichkeit sicherzustellen, dass die Parameter in der Reihenfolge erscheinen, in der Sie sie in der Klasse haben.