1

我正在尝试使用 C# 和 Dapper 调用用 plpgsql 编写的 Postgresql 存储过程,但我发现 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;
4

1 回答 1

1

在内部,Dapper 使用反射来获取 param 对象的属性。具体来说,GetProperies(...)麻烦的是,这些不能保证按特定顺序排列......

GetProperties 方法不按特定顺序返回属性,例如字母顺序或声明顺序。您的代码不得依赖于返回属性的顺序,因为该顺序会有所不同。

为了有点有用,他们选择按字母顺序对参数进行排序,但不幸的是,无法确保参数按照您在类中的顺序出现。

于 2012-07-31T20:40:28.737 回答