DapperとSQL空間型をパラメータとして使用する

dapper orm spatial sql-server-2008

質問

基本的に次のようなクエリを実行する必要があるシステムがあります。

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

これは、バニラSQLパラメータを使用するときには非常に簡単です。非典型的な方法でパラメータを作成するだけです(ビルダー変数は、私が矩形を作成するために使用するSqlGeometryBuilderです)。

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

さて、私がdapperを使ってこれをしようとすると、これをパラメータとして使う方法が分からないというエラーが出ます。これを手に入れた人、またはこれを有効にする方法の指針は誰ですか?私は回避策がありますが、それは文字列表現を使用して、SQLクエリのジオメトリタイプに変換します。私は本当にそれを望んでいない。

コメントに答えるために、私が得ているエラーは 'Microsoft.SqlServer.Types.SqlGeometry型のメンバパラメータはパラメータ値として使用できません'です。言い換えれば、dapperはSqlGeometryオブジェクトをパラメータとして扱う方法を知らない。

受け入れられた回答

奇妙で素晴らしいDB固有のSqlMapper.IDynamicParametersを実装する鍵は、すべて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.EntityFramework 1.26はDbGeographyをサポートしていDbGeography
  • Dapper 1.32にはSqlGeographyサポートがSqlGeographyれていSqlGeography
  • Dapper 1.33にはSqlGeometry組み込みサポートがありSqlGeometry
  • Dapper.EntityFramework 1.33にはDbGeometryのサポートがDbGeometryれていDbGeometry
  • Dapper 1.34にはSqlHierarchyId組み込みサポートがありSqlHierarchyId

したがって、最新の図書館では、それは単に機能するはずです。



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ