Nyckeln till att implementera konstiga och underbara DB-specifika parametrar handlar om SqlMapper.IDynamicParameters
Detta enkla gränssnitt har en enda slutpunkt:
public interface IDynamicParameters
{
void AddParameters(IDbCommand command);
}
Dapper har redan en DB-generisk implementering av detta gränssnitt som heter:DynamicParameters
som låter dig hantera ut- och returvärden.
För att efterlikna dessa rumsliga saker skulle jag prova något i stil med:
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
});
}
}
Användning:
cnn.Query("SELECT * FROM MyTable WHERE @parameter.STIntersects(MyGeometryColumn)",
new SpatialParam("@parameter", builder.ConstructedGeometry));
Den här enkla implementeringen av gränssnittet hanterar bara en enda param, men den kan enkelt utökas till att hantera flera parametrar, antingen genom att skicka in från konstruktorn eller lägga till en hjälparmetod AddParameter.