Nøglen til at implementere mærkelige og vidunderlige DB-specifikke parametre koger alle ned til SqlMapper.IDynamicParameters
Denne enkle grænseflade har et enkelt slutpunkt:
public interface IDynamicParameters
{
void AddParameters(IDbCommand command);
}
Dapper har allerede en generisk DB-implementering af denne grænseflade kaldet:DynamicParameters
som giver dig mulighed for at håndtere output- og returværdier.
For at efterligne disse rumlige ting ville jeg prøve noget som:
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
});
}
}
Brug:
cnn.Query("SELECT * FROM MyTable WHERE @parameter.STIntersects(MyGeometryColumn)",
new SpatialParam("@parameter", builder.ConstructedGeometry));
Denne enkle implementering af grænsefladen håndterer kun en enkelt parameter, men den kan nemt udvides til at håndtere flere parametre, enten ved at sende ind fra konstruktøren eller tilføje en hjælpe-AddParameter-metode.