Я использую protobuf-net в своем приложении для отправки зарегистрированных данных с удаленного сайта на сервер. Существует несколько типов данных — пример сообщения одного из них выглядит следующим образом:
message Sample {
required int64 recording_time = 1; // UTC Timestamp in Ticks
required double x_position = 2;
required double y_position = 3;
required double x_velocity = 4;
required double y_velocity = 5;
}
На сервере объект хранится в базе данных PostgreSQL. Все поля double
в сообщении буфера протокола (proto2
) сопоставляются с полями double
в PostgreSQL. Поле метки времени uint64 recording_time
должно быть сопоставлено с полем timestamp with time zone
в базе данных.
Я хочу использовать тот же класс C# (с атрибутом ProtoContract
) для сериализации Sample
на клиенте, а также с Dapper для операций с базой данных (возможно, с расширением, например, FastCRUD).
Для этого требуется сопоставление/преобразование между ticks
(тип C#: long) и timestamp with time zone
(тип C#: DateTime). Каков наилучший способ реализовать это, не создавая второй класс?
Вот как я сейчас пишу объекты в базу данных:
string sql = "COPY samples (recording_time, x_position, y_position, x_velocity, y_velocity) FROM STDIN (FORMAT BINARY)";
using (var writer = conn.BeginBinaryImport(sql))
{
foreach (Sample sample in sampleList)
{
writer.StartRow();
writer.Write(new DateTime(sample.RecordingTime, DateTimeKind.UTC), NpgsqlTypes.NpgsqlDbType.TimestampTZ);
writer.Write(sample.X_Position, NpgsqlTypes.NpgsqlDbType.Double);
writer.Write(sample.Y_Position, NpgsqlTypes.NpgsqlDbType.Double);
writer.Write(sample.X_Velocity, NpgsqlTypes.NpgsqlDbType.Double);
writer.Write(sample.Y_Velocity, NpgsqlTypes.NpgsqlDbType.Double);
}
}
Вот как я хочу написать в базу данных:
foreach (Sample sample in sampleList)
{
conn.Insert<Sample>(sample);
}
И используйте соответствующий метод Query
для поиска.
Sample
из запроса. Есть ли способ записать это преобразование в конфигурацию/инициализацию Dapper? - person Abir   schedule 05.10.2016