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.