AutoMapper-使用ProjectTo(IQueryable)将UTC转换为时区



我试图找到一种方法,使用automapper将所有系统日期(UTC(转换为用户时区。我基本上在使用方法"ProjectTo"时遇到了一个问题,到目前为止已经尝试了以下非工作解决方案

  1. 使用ITypeConverter创建从DateTime到DateTime的映射
  2. 使用IMemberValueResolver的自定义实现

是否有任何解决方案,或者是否需要将IQueryable转换为List

更新#1

我想执行以下行代码

TimeZoneInfo.ConvertTimeFromUtc(utc_date, some_timezone)

提前谢谢。

TM

是的,我认为首先需要将IQueryable转换为List。AutoMapper的ProjectTo()是LINQ的Select()的一个方便的包装器。它将映射配置转换为表达式,稍后通过类似ORM的实体框架或Dapper将其转换为SQL查询。这就是为什么ProjectTo()只支持AutoMapper的一些功能的原因。只有那些可以被翻译成表达式的才会起作用。没有ORM知道如何翻译:

TimeZoneInfo.ConvertTimeFromUtc(utc_date, some_timezone)

尽管有一些SQL函数用于将偏移量应用于日期时间,例如T-SQL的SWITCHOFFSET(文档中有更多内容(,但我怀疑它是否适合您的需求,因为它应该与插入的AutoMapper一起工作。

我建议首先从数据库中获取数据,然后应用适当的时区偏移。这样的方法将省去数据库查询中时区调整的麻烦,并且您可以直接访问用户时区,我认为用户时区不是固定的常数。

最新更新