La clé pour implémenter des paramètres spécifiques à la base de données étranges et merveilleux se résume à SqlMapper.IDynamicParameters
Cette interface simple a un point de terminaison unique :
public interface IDynamicParameters
{
void AddParameters(IDbCommand command);
}
Dapper a déjà une implémentation générique DB de cette interface appelée :DynamicParameters
qui vous permet de gérer les valeurs de sortie et de retour.
Pour émuler ce truc spatial, j'essaierais quelque chose comme :
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
});
}
}
Utilisation :
cnn.Query("SELECT * FROM MyTable WHERE @parameter.STIntersects(MyGeometryColumn)",
new SpatialParam("@parameter", builder.ConstructedGeometry));
Cette implémentation simple de l'interface ne gère qu'un seul paramètre, mais elle peut facilement être étendue pour gérer plusieurs paramètres, soit en passant du constructeur, soit en ajoutant une méthode d'assistance AddParameter.