Измените Dapper так, чтобы он отображал нулевое значение базы данных в double.NaN - PullRequest
2 голосов
/ 17 февраля 2012

В моей базе данных SQLite есть двойной столбец, который может содержать null.

При чтении из базы данных (для столбцов типа double) я хотел бы преобразовать нули в "double.NaN".* В настоящее время dapper устанавливает нулевые значения в 0, что мне не нужно.

Какие у меня параметры?

  1. Изменить исходный код Dapper.
  2. Не можете использовать Dapper, нужно написать мой собственный код ADO.NET по старинке?
  3. изменить способ, которым я вызываю метод cnn.Query, чтобы изменить способ отображенияслучается.

Мой первый выбор - вариант 1, но мне нужна помощь в изменении Dapper.

1 Ответ

6 голосов
/ 28 февраля 2012

Лично я буду советовать против этого;нуль не совсем то же самое, что NaN.Если вы действительно хотите это сделать, вам нужно взглянуть на GetTypeDeserializer.Код для этого генерируется динамически с использованием ILGenerator и является довольно сложным.Если вы ищете строку:

il.MarkLabel(isDbNullLabel); // incoming stack: [target][target][value]

, то это то место, куда код переходит, если обнаружен DbNull.В настоящее время он просто извлекает два значения (значение и цель) из стека, бросает их на пол и продолжает.Вам нужно будет проверить float / double в качестве особого случая, применить свое преобразование, а затем назначить NaN члену.

Я повторяю свое утверждение, однако, что это простодействительная вещь, чтобы сделать.Гораздо более простым вариантом будет:

public double? Value {get;set;}

, который требует нулевых изменений и будет работать в настоящее время.Если вы действительно хотите, чтобы он обрабатывался как необнуляемый тип double, возможно:

private double foo = double.NaN;
public double Foo { get { return foo; } set { foo = value; } }

теперь по умолчанию он будет NaN и будет корректно реализовываться при наличии значений.

...