通过 Dapper 在查询中传递 UTC 日期

pass UTC dates in query via Dapper

我在这里为自己(如果没有其他人)发布一个答案,因为我从来没有发现它在 SO 的其他地方有明显的布局。为此浪费了几个小时。

我想通过以下方式使用 Dapper:

await dapper.Connection().QueryAsync<T>(insertSQL, obj);
例如,

insertSQL 可以是将日期字段添加到 table 记录中的插入语句。 obj 对象提供这些字段的值作为参数。

如果日期需要是 UTC 类型,问题就开始了。数据库字段是 timestamptz,这样很好。但是如何说服 Dapper 发送支持 UTC 的 SQL?

这个问题我苦思冥想了好久

对我有用的方法:使用 'DateTimeOffset',而不是 'DateTime' C# 类型。

当您使用 DateTime 时,您可以做一些事情(DateTimeKind 等),但它们无助于 Dapper 将正确制定的​​语句发送到(在我的例子中)PostgreSQL。您可能会开始认为 Dapper 无法帮助您。t/won

但是,如果您的 C# 对象以 DateTimeOffset 格式存储日期,Dapper 会很好地帮助您。因此,在您的 类 中,考虑 UTC 样式时请避免 DateTime 属性 类型。

这可能太含糊了,但也许这足以让像我这样的下一个人走上一条好路,如果他们问的是我今天问的同样问题。

PS——既然我理解了 DateTimeOffset 与 DateTime,那么 Dapper 失败的原因就很明显了。它正在从 C# 对象作为日期时间(无时区信息)吸取的内容转换为 PostgreSQL“DateTimeOffset”(读取,timestamptz)。它注定要失败。但是,在 C# 对象中存储一个 DateTimeOffset,当 Dapper 向数据库提供带时区的日期时间时,Dapper 会很乐意提供所有详细信息,包括日期、时间和以小时为单位的相关偏移量。