首页 > 解决方案 > 通过 Dapper 在查询中传递 UTC 日期

问题描述

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

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

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

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

如果日期需要是 UTC 类型,问题就开始了。数据库字段是 timestamptz,所以没关系。但是如何说服 Dapper 发送支持 UTC 的 SQL 呢?

我在这个问题上敲了很长时间。

标签: c#postgresqldapperutc

解决方案


什么对我有用:使用“DateTimeOffset”,而不是“DateTime”C# 类型。

当您使用 DateTime 时,您可以做一些事情(DateTimeKind 等),但它们无助于 Dapper 向(在我的情况下)PostgreSQL 发送正确制定的​​语句。您可能会开始认为 Dapper 不能/不会帮助您。

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

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

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


推荐阅读