Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Utilisation de Dapper avec les types spatiaux SQL en tant que paramètre

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.