我试图将NodaTime的OffsetDateTime类型映射到Server,但我不知道如何解决NodaTime的OffsetDateTime和Server的DateTimeOffset类型之间的阻抗问题。
我遇到的主要问题是让LINQ支持正确工作,因为OffsetDateTime没有比较运算符,比如<。这些系统在如何处理平等问题上也存在差异。NodaTime既考虑时间上的瞬间,也考虑偏移量,而Server只考虑时间上的瞬间。
2015-12-24 11:18+01:00和2015-12-24 10:18+00:00在Server中被认为是相等的,但在NodaTime中并不相等。
我考虑使用ICompositeUserType将UTC日期/时间和偏移量存储在单独的列中(类似于Server 2008之前),但OffsetDateTime没有UTC/Instant属性。因此,我看不出如何在LINQ查询中获取date.ToInstant()以正确映射到ICompositeUserType中的属性。
发布于 2015-12-24 21:59:33
OffsetDateTime应该映射到Server datetimeoffset。NHibernate通过IUserType 如本文所述对自定义类型映射的支持对于实现这一工作至关重要。
虽然OffsetDateTime没有直接实现IComparable,但是可以使用OffsetDateTime.Comparer.Instant对它们进行比较。这在LINQ查询中可能仍然很难使用,但这是一个值得探索的途径。
也许有人应该编写一个NHibernate-NodaTime集成包来简化这个过程。考虑到我以前为RavenDB和脱衣舞做过这样的事情,我将考虑它。:)
抱歉,我没有更好的答案了。
更新
我开始着手这方面的工作,并成功地为OffsetDateTime构建了一个OffsetDateTime,但它不适用于比较操作符--这正是您描述的原因。我认为该解决方案涉及扩展linq提供程序,类似于描述的在这篇博客文章中技术。我还没有一个完整的工作例子,但我会更新这里,当我这样做。
最终,您将无法编写:
session.Query<Foo>().Where(x => x.SomeODT > value)因为OffsetDateTime没有比较运算符,所以不会编译。
相反,应该扩展LINQ提供程序以支持以下内容:
session.Query<Foo>().Where(x => OffsetDateTime.Comparer.Instant.Compare(x.SomeODT, value) > 0)或者也许更干净些,比如:
session.Query<Foo>().Where(x => x.SomeODT.ToInstant() > value.ToInstant())或者两者都有。两者都会编译,但是在LINQ提供程序中没有适当的支持就会抛出异常。
第二次更新
有人比我早。现在有一组扩展用于NHibernate,以支持Noda时间数据类型在这个项目中。:)
https://stackoverflow.com/questions/34452792
复制相似问题