Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Usando Dapper com SQL Spatial Types como parâmetro


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.