Для dapper мне нужно создать поддержку для передачи параметров AnsiString.
В базах данных есть строки как в Unicode, так и в строках, отличных от Unicode, поэтому выбор правильного типа параметра иногда имеет решающее значение.
DbType.String
против DbType.AnsiString
для конкретного параметра может сильно повлиять на производительность.
В dapper мы передаем параметры динамически, например:
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
, с семантикой, похожей на пример выше?