【问题标题】:AutoMapper - Convert UTC to Timezone with ProjectTo (IQueryable)AutoMapper - 使用 ProjectTo (IQueryable) 将 UTC 转换为时区
【发布时间】:2021-12-24 23:07:03
【问题描述】:
我试图找出一种使用自动映射器将所有系统日期 (UTC) 转换为用户时区的方法。我基本上在使用“ProjectTo”方法时遇到了问题,到目前为止,我已经尝试了以下无效的解决方案
- 使用 ITypeConverter 创建从 DateTime 到 DateTime 的映射
- 使用 IMemberValueResolver 的自定义实现
是否有任何解决方案或需要首先将 IQueryable 转换为 List?
更新 #1
我要执行下面一行代码
TimeZoneInfo.ConvertTimeFromUtc(utc_date, some_timezone)
提前致谢。
TM
【问题讨论】:
标签:
.net
asp.net-mvc
.net-core
automapper
【解决方案1】:
是的,我认为您首先需要将IQueryable 转换为List。 AutoMapper 的 ProjectTo() 是 LINQ 的 Select() 的便捷包装器。它将映射配置转换为表达式,稍后由 ORM(如 Entity Framework 或 Dapper)转换为 SQL 查询。这就是为什么ProjectTo() 只支持 AutoMapper 的features 中的一小部分的原因。只有那些可以翻译成表达式的才会起作用。没有 ORM 会知道如何翻译:
TimeZoneInfo.ConvertTimeFromUtc(utc_date, some_timezone)
虽然有用于将偏移量应用于日期时间的 SQL 函数,例如 T-SQL 的 SWITCHOFFSET(更多内容见 docs),但我怀疑它是否适合您的需求,因为它应该与 AutoMapper 插件一起使用 -在。
我建议首先从数据库中获取数据,然后应用适当的时区偏移量。这种方法可以省去在数据库查询中调整时区的麻烦,并且可以直接访问用户时区,我认为这不是一个固定的常数。