21

Dapper を使用して、PostgreSQL データベースにアクセスする必要があるいくつかの負荷テスト ツールを作成しています。この特定のバージョンの PostgreSQL は GUID をネイティブにサポートしていないため、GUID 値は 32 文字の文字列として格納されます。値は を使用して文字列someGuid.ToString("N")に変換されます。Guid への変換は を使用して行うことができますnew Guid(stringValueFromColumn)

私の質問は、どうすれば Dapper に文字列を読み取らせ、それらを Guid に変換させることができるかということです。

DbType マッピングを変更しようとしましたが、うまくいきません。

4

6 に答える 6

26

おそらく、これを行う最も簡単な方法 (dapper を待たずに) は、2 つ目のプロパティを用意することです。

public Guid Foo {get;set;}

public string FooString {
    get { return Foo.ToString("N"); }
    set { Foo = new Guid(value); }
}

クエリでは、列を としてエイリアスしますFooString

もちろん、これは質問を促します: dapper はこの種のプライベート プロパティをサポートする必要がありますか? 私が言うには:おそらく。

于 2011-05-07T11:47:14.180 に答える
5

これは古い質問ですが、Dapper がプライベート プロパティをサポートするようになったため、更新する必要があると感じています。これは、マークが回答で参照しています。

private String UserIDString { get; set; }
public Guid UserID
{
    get
    {
        return new Guid(UserIDString);
    }
    private set
    {
        UserID = value;
    }
}

次に、SQL で ID 列にエイリアスを指定して、実際のプロパティではなくプライベート プロパティにマップします。

SELECT UserID AS UserIDString FROM....
于 2015-07-24T09:56:50.777 に答える
2

一緒に解決策をハックしました。私が知る限り、Dapper に特定の型の代替バインディング コードを生成するように指示する方法はないのでGetClassDeserializer、プロパティが GUID の場合にアンボックス型を強制的に文字列にするようにメソッドを変更しました。次に、列挙型のコンストラクター呼び出しを生成するコードを再利用しました。

変更されたコード スニペットは次のとおりです (リビジョン rf6d62f91f31a の 761 行目から) :

// unbox nullable enums as the primitive, i.e. byte etc
  var nullUnderlyingType = Nullable.GetUnderlyingType( item.Info.Type );
  var unboxType = nullUnderlyingType != null && nullUnderlyingType.IsEnum ? nullUnderlyingType : item.Info.Type;
  if( unboxType == typeof(Guid))
  {
    unboxType = typeof (string);
  }
  il.Emit( OpCodes.Unbox_Any, unboxType ); // stack is now [target][target][typed-value]
  if (  ( item.Info.Type == typeof( Guid ) && unboxType == typeof( string ) ) 
        || ( nullUnderlyingType != null && nullUnderlyingType.IsEnum ) )
  {
    il.Emit( OpCodes.Newobj, item.Info.Type.GetConstructor( new[] { nullUnderlyingType ?? unboxType} ) );
  }

  il.Emit( OpCodes.Callvirt, item.Info.Setter ); // stack is now [target]
于 2011-05-06T10:07:47.057 に答える
0

それが役立つことを願っています。

クエリでエイリアスを使用する必要はありませんでした。私がしたこと:

public abstract class Entity
{
    protected Entity()
    {
        Id = Guid.NewGuid().ToString();
    }

    public string Id
    {
        get; set; 
    }
}

そして、あなたのテーブルでは varchar としてのタイプ

于 2020-05-13T00:19:45.287 に答える