8

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

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 オブジェクトをパラメーターとして処理する方法を知りません。

4

3 に答える 3

10

奇妙で素晴らしい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));

このインターフェイスの単純な実装は、1 つのパラメーターのみを処理しますが、コンストラクターから渡すか、ヘルパーの AddParameter メソッドを追加することにより、複数のパラメーターを処理するように簡単に拡張できます。

于 2011-07-14T23:46:43.020 に答える
5

Dapper のコアを変更しても構わない場合は、私が行ったことを使用できます... https://gist.github.com/brendanmckenzie/4961483

Microsoft.SqlServer.Types.SqlGeographyパラメータを受け入れるように Dapper を変更しました。

于 2013-02-15T16:28:30.467 に答える
3
  • Dapper.EntityFramework 1.26 はDbGeography
  • Dapper 1.32 には組み込みのサポートがあります。SqlGeography
  • Dapper 1.33 には組み込みのサポートがあります。SqlGeometry
  • Dapper.EntityFramework 1.33 には組み込みのサポートがあります。DbGeometry
  • Dapper 1.34 には組み込みのサポートがあります。SqlHierarchyId

最新のライブラリではそうです。それは単に機能するはずです。

于 2014-08-28T08:55:50.873 に答える