De sleutel tot het implementeren van rare en prachtige DB-specifieke parameters komt allemaal neer op SqlMapper.IDynamicParameters
Deze eenvoudige interface heeft één eindpunt:
public interface IDynamicParameters
{
void AddParameters(IDbCommand command);
}
Dapper heeft al een generieke DB-implementatie van deze interface genaamd:DynamicParameters
waarmee u uitvoer- en retourwaarden kunt verwerken.
Om dit ruimtelijke spul na te bootsen zou ik zoiets proberen als:
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
});
}
}
Gebruik:
cnn.Query("SELECT * FROM MyTable WHERE @parameter.STIntersects(MyGeometryColumn)",
new SpatialParam("@parameter", builder.ConstructedGeometry));
Deze eenvoudige implementatie van de interface verwerkt slechts een enkele parameter, maar kan eenvoudig worden uitgebreid om meerdere parameters te verwerken, hetzij door de constructor door te geven of door een hulpmethode AddParameter toe te voegen.