Ответ 1
Причина в том, что формат даты BSON DateTime сохраняет значения с меньшей точностью, чем значение .NET DateTime, поэтому, когда вы читаете его обратно из базы данных, значение было усечено.
Если ваше значение DateTime является свойством класса С#, которое вы сериализуете, вы можете попросить сериализатор сериализовать значение DateTime в качестве встроенного документа, содержащего как значение BSON DateTime (усеченное), так и исходное значение .NET DateTime (сохраненное как Клещи). В этом случае значение не будет усечено при десериализации.
Например:
public class MyClass {
public ObjectId Id;
[BsonRepresentation(BsonType.Document)]
public DateTime MyDateTime;
}
Вы также можете использовать BsonRepresentation Int64 или String и не потерять точность, но тогда у сохраненного документа есть только Ticks или строковое представление, а не BSON DateTime, что затрудняет выполнение связанных с DateTime запросов.
Вы также захотите иметь в виду, что значения DateTime хранятся в UTC в базе данных. Лучшей практикой является всегда использовать значения UTC для хранения и использовать только локальные времена при отображении их пользователю.