Ключът към внедряването на странни и прекрасни параметри, специфични за DB, се свежда до SqlMapper.IDynamicParameters
Този прост интерфейс има една крайна точка:
public interface IDynamicParameters
{
void AddParameters(IDbCommand command);
}
Dapper вече има общо изпълнение на DB на този интерфейс, наречено:DynamicParameters
което ви позволява да обработвате изходни и връщани стойности.
За емулиране на тези пространствени неща бих опитал нещо като:
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
});
}
}
Употреба:
cnn.Query("SELECT * FROM MyTable WHERE @parameter.STIntersects(MyGeometryColumn)",
new SpatialParam("@parameter", builder.ConstructedGeometry));
Тази проста реализация на интерфейса обработва само един параметър, но може лесно да бъде разширена, за да обработва множество параметри, или чрез предаване от конструктора, или чрез добавяне на помощен метод AddParameter.