ANSISTRINGを表すために使用できる.NETフレームワークに組み込みクラスがありますか?
-
07-09-2020 - |
質問
Dapperの場合、厳しいパラメータを渡すためのサポートを構築する必要があります。
データベースにはUnicode文字列と非Unicode文字列の両方があり、正しいパラメータタイプを選択することは明確になります。
特定のパラメータのDbType.String
vs DbType.AnsiString
は、PERFを大幅に効果的に効果的にします。
Dapperではパラメータを動的に渡します。
Query<User>("select * from Users where Name=@Name", new {Name = "name"});
.
typeof(String)
DbType.String
がわかっているとする内部マップがあります。
しかし、私は私のユーザーが文字列がAnSistringであるべきであることを示すことができるようにしたいです。属性は匿名クラスではサポートされていませんので、これには異なるタイプが必要です。
明らかに私は1つを発明することができます:
public class AnsiString
{
private readonly string str;
public AnsiString(string str)
{
this.str = str;
}
public String Value { get { return str; } }
}
.
これは私にクリーンなAPIを与えるでしょう:
Query<User>("select * from Users where Name=@Name",
new {Name = new AnsiString("name")});
.
しかしながら、このようなクラスがSystem.DataまたはBCLに存在する場合は、発明を作成するのです。
BCLまたはSystem.Data
のどこかのタイプは、上記のサンプルのサンプルと同様の意味論を持つAnsiString
の容器として使用できますか?
解決
BCLまたはSystem.Dataにはそのようなクラスはありません、あなたはあなた自身を転がす必要があります。
私たちはカスタムタイプを締めくくっていました。このテストは典型的な使用法を示しています:
public void TestDbString()
{
var obj = connection.Query("select datalength(@a) as a, datalength(@b) as b, datalength(@c) as c, datalength(@d) as d, datalength(@e) as e, datalength(@f) as f",
new
{
a = new DbString { Value = "abcde", IsFixedLength = true, Length = 10, IsAnsi = true },
b = new DbString { Value = "abcde", IsFixedLength = true, Length = 10, IsAnsi = false },
c = new DbString { Value = "abcde", IsFixedLength = false, Length = 10, IsAnsi = true },
d = new DbString { Value = "abcde", IsFixedLength = false, Length = 10, IsAnsi = false },
e = new DbString { Value = "abcde", IsAnsi = true },
f = new DbString { Value = "abcde", IsAnsi = false },
}).First();
((int)obj.a).IsEqualTo(10);
((int)obj.b).IsEqualTo(20);
((int)obj.c).IsEqualTo(5);
((int)obj.d).IsEqualTo(10);
((int)obj.e).IsEqualTo(5);
((int)obj.f).IsEqualTo(10);
}
.
だから;それはサポートしています:
- ANSI対Unicode
- 固定VS動的長
- 動的長さの場合は、VS暗黙(長さが<= 4000の場合は4000;その他の場合は4000)を説明します。それ以外の場合は、クエリプランの数を保持)
型は dapper 。
他のヒント
string
for DbType.String
とchar[]
用のDbType.AnsiString
を使用できると思います。
あなたの現在のコードと非常によく似ています:
Query<User>("select * from Users where Name=@Name", new {Name = "name".ToCharArray()});
.
またはAnSistringを使用している場合は、拡張方法.ToAnsiString()
を作成できます。
public static AnsiString( this string s ) { return new AnsiString(s); }
Query<User>("select * from Users where Name=@Name", new {Name = "name".ToAnsiString()});
.