Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Utilizzo di Dapper con i tipi spaziali SQL come parametro

La chiave per implementare parametri specifici DB strani e meravigliosi si riduce a SqlMapper.IDynamicParameters

Questa semplice interfaccia ha un unico endpoint:

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

Dapper ha già un'implementazione DB generica di questa interfaccia chiamata:DynamicParameters che consente di gestire l'output e restituire i valori.

Per emulare questa roba spaziale, proverei qualcosa come:

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
       });
    }
}

Utilizzo:

cnn.Query("SELECT * FROM MyTable WHERE @parameter.STIntersects(MyGeometryColumn)",
  new SpatialParam("@parameter", builder.ConstructedGeometry));

Questa semplice implementazione dell'interfaccia gestisce solo un singolo parametro, ma può essere facilmente estesa per gestire più parametri, passando dal costruttore o aggiungendo un metodo di supporto AddParameter.