Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Verwenden von Dapper mit räumlichen SQL-Typen als Parameter

Der Schlüssel zur Implementierung seltsamer und wunderbarer DB-spezifischer Parameter läuft alles auf SqlMapper.IDynamicParameters hinaus

Diese einfache Schnittstelle hat einen einzigen Endpunkt:

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

Dapper hat bereits eine generische DB-Implementierung dieser Schnittstelle namens:DynamicParameters wodurch Sie Ausgabe- und Rückgabewerte verarbeiten können.

Um dieses räumliche Zeug zu emulieren, würde ich so etwas versuchen:

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

Verwendung:

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

Diese einfache Implementierung der Schnittstelle verarbeitet nur einen einzigen Parameter, kann aber leicht erweitert werden, um mehrere Parameter zu verarbeiten, entweder durch Übergabe vom Konstruktor oder durch Hinzufügen einer AddParameter-Hilfsmethode.