gpt4 book ai didi

c# - .Net 框架中是否有可用于表示 AnsiString 的内置类?

转载 作者:行者123 更新时间:2023-11-30 12:51:47 27 4
gpt4 key购买 nike

对于 dapper,我需要构建对传递 AnsiString 参数的支持。

数据库有 unicode 和非 unicode 字符串,选择正确的参数类型有时很重要。

DbType.StringDbType.AnsiString 对于特定参数会严重影响性能。

在dapper中我们动态传入参数,Eg:

Query<User>("select * from Users where Name=@Name", new {Name = "name"});

我有一个内部映射表明,如果我看到 typeof(String),我知道将参数作为 DbType.String 传递

但是,我希望我的用户能够表示字符串应该是 AnsiString。匿名类不支持属性,因此我需要一个不同的类型。

显然我可以发明一个:

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
  • 固定长度与动态长度
  • 在动态长度的情况下,显式与隐式(如果长度 <= 4000 则为 4000;否则为“最大”- 这使查询计划的数量保持不变)

类型在dapper内可用.

关于c# - .Net 框架中是否有可用于表示 AnsiString 的内置类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6069021/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com