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.