A chave para implementar parâmetros específicos de banco de dados estranhos e maravilhosos se resume a
SqlMapper.IDynamicParameters
Essa interface simples tem um único endpoint:
public interface IDynamicParameters
{
void AddParameters(IDbCommand command);
}
O Dapper já possui uma implementação genérica de banco de dados dessa interface chamada:
DynamicParameters
que permite que você manipule valores de saída e retorno. Para emular esse material espacial, eu tentaria algo como:
public class SpatialParam : SqlMapper.IDynamicParameters
{
string name;
object val;
public SpatialParam(string name, object val)
{
this.name = name;
this.val = val;
}
public void AddParameters(IDbCommand command, SqlMapper.Identity identity)
{
var sqlCommand = (SqlCommand)command;
sqlCommand.Parameters.Add(new SqlParameter
{
UdtTypeName = "geometry",
Value = val,
ParameterName = name
});
}
}
Uso:
cnn.Query("SELECT * FROM MyTable WHERE @parameter.STIntersects(MyGeometryColumn)",
new SpatialParam("@parameter", builder.ConstructedGeometry));
Essa implementação simples da interface lida com apenas um único parâmetro, mas pode ser facilmente estendida para lidar com vários parâmetros, passando do construtor ou adicionando um método auxiliar AddParameter.