2011-07-14 43 views
8

我有基本上必须做这样的查询系统:使用小巧玲珑与SQL空间类型作为参数

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

这是非常简单的香草SQL参数时做的,你就必须在一个非典型的方式来创建你的参数(其中建设者变量是我用它来创建一个矩形一个SqlGeometryBuilder):

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

现在,当我试图做到这一点使用短小精悍,我得到一个错误它无法弄清楚如何使用它作为参数。谁有这个工作,或任何指示如何启用此?我有一个解决方法,但涉及使用字符串表示并将其转换为SQL查询中的几何类型。我真的不想那样。

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

+0

你正在收到什么错误? –

回答

10

来实现怪异和奇妙的DB具体PARAMS所有的关键归结为SqlMapper.IDynamicParameters

这个简单的接口只有一个端点:

public interface IDynamicParameters 
{ 
    void AddParameters(IDbCommand command); 
} 

小巧玲珑已经有一个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)); 

这种简单的接口的实现只处理一个PARAM,但它可以很容易通过从构造函数传入或添加助手AddParameter方法来扩展以处理多个参数。

+0

它完美的作品!谢谢:) –

+0

注意:当前版本的Dapper(在撰写本评论时)有一个稍微不同的接口方法签名,现在=>'void AddParameters(IDbCommand command,SqlMapper.Identity identity)' –

1
  • Dapper.EntityFramework 1.26有DbGeography
  • 小巧玲珑1.32支持有SqlGeography
  • 小巧玲珑1.33的内置支持有SqlGeometry
  • 内置支持Dapper.EntityFramework 1.33有DbGeometry
  • 小巧精致的内置支持1.34内置支持SqlHierarchyId

所以最新的图书馆;它应该简单地工作。