La raison en est que le format BSON DateTime stocke les valeurs avec moins de précision qu'une valeur .NET DateTime, donc lorsque vous la relisez à partir de la base de données, la valeur a été tronquée.
Si votre valeur DateTime est une propriété d'une classe C# que vous sérialisez, vous pouvez demander au sérialiseur de sérialiser la valeur DateTime en tant que document incorporé contenant à la fois la valeur BSON DateTime (tronquée) et la valeur .NET DateTime d'origine (stockée sous forme de Ticks). Dans ce cas, la valeur ne sera pas tronquée lors de la désérialisation.
Par exemple :
public class MyClass {
public ObjectId Id;
[BsonRepresentation(BsonType.Document)]
public DateTime MyDateTime;
}
Vous pouvez également utiliser un BsonRepresentation de Int64 ou String et ne pas perdre de précision, mais alors le document stocké uniquement a des ticks ou une représentation sous forme de chaîne et pas de BSON DateTime, ce qui rend difficile les requêtes liées à DateTime.
Vous voudrez également garder à l'esprit que les valeurs DateTime sont stockées en UTC dans la base de données. La meilleure pratique consiste à toujours utiliser les valeurs UTC pour le stockage et à n'utiliser que les heures locales lors de leur affichage à l'utilisateur.