sql server 2008 -使用Dapper与sql空间类型作为参数



我有一个系统它基本上需要做这样的查询:

SELECT * FROM MyTable WHERE @parameter.STIntersects(MyGeometryColumn)

这是相当简单的做时,使用香草SQL参数,你只需要创建你的参数在一个非典型的方式(其中的生成器变量是一个SqlGeometryBuilder,我用它来创建一个矩形):

command.Parameters.Add(new SqlParameter
{
    UdtTypeName = "geometry",
    Value = builder.ConstructedGeometry,
    ParameterName = "@paremeter"
});

现在,当我尝试使用dapper这样做时,我得到一个错误,它无法找出如何使用this作为参数。谁得到了这个工作,或任何指针如何启用这一点?我确实有一个解决方案,但这涉及到使用字符串表示并将其转换为SQL查询中的几何类型。我真的不想那样。

要回答评论,我得到的错误是"类型Microsoft.SqlServer.Types.SqlGeometry的成员参数不能用作参数值"。换句话说,dapper不知道如何处理作为参数的SqlGeometry对象。

实现奇怪而美妙的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方法轻松地扩展为处理多个参数。

如果你不介意修改Dapper的核心,那么你可以使用我所做的…https://gist.github.com/brendanmckenzie/4961483

我修改了Dapper以接受Microsoft.SqlServer.Types.SqlGeography参数

  • 衣冠楚楚的。EntityFramework 1.26支持DbGeography
  • Dapper 1.32内置SqlGeography支持
  • Dapper 1.33已内置SqlGeometry支持
  • 衣冠楚楚的。EntityFramework 1.33内置了对DbGeometry
  • 的支持
  • Dapper 1.34内置SqlHierarchyId支持

对于最新的库;

相关内容

  • 没有找到相关文章

最新更新