sql >> Base de Datos >  >> RDS >> Sqlserver

Uso de Dapper con tipos espaciales de SQL como parámetro

La clave para implementar extraños y maravillosos parámetros específicos de bases de datos se reduce a SqlMapper.IDynamicParameters

Esta sencilla interfaz tiene un único punto final:

public interface IDynamicParameters
{
    void AddParameters(IDbCommand command);
}

Dapper ya tiene una implementación genérica de DB de esta interfaz llamada:DynamicParameters que le permite manejar valores de salida y retorno.

Para emular estas cosas espaciales, probaría 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));

Esta implementación simple de la interfaz maneja solo un único parámetro, pero se puede extender fácilmente para manejar múltiples parámetros, ya sea pasándolo desde el constructor o agregando un método auxiliar AddParameter.