首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OffsetDateTime与NHibernate的结合

OffsetDateTime与NHibernate的结合
EN

Stack Overflow用户
提问于 2015-12-24 12:24:32
回答 1查看 807关注 0票数 3

我试图将NodaTime的OffsetDateTime类型映射到Server,但我不知道如何解决NodaTime的OffsetDateTime和Server的DateTimeOffset类型之间的阻抗问题。

我遇到的主要问题是让LINQ支持正确工作,因为OffsetDateTime没有比较运算符,比如<。这些系统在如何处理平等问题上也存在差异。NodaTime既考虑时间上的瞬间,也考虑偏移量,而Server只考虑时间上的瞬间。

2015-12-24 11:18+01:002015-12-24 10:18+00:00在Server中被认为是相等的,但在NodaTime中并不相等。

我考虑使用ICompositeUserType将UTC日期/时间和偏移量存储在单独的列中(类似于Server 2008之前),但OffsetDateTime没有UTC/Instant属性。因此,我看不出如何在LINQ查询中获取date.ToInstant()以正确映射到ICompositeUserType中的属性。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-24 21:59:33

OffsetDateTime应该映射到Server datetimeoffset。NHibernate通过IUserType 如本文所述对自定义类型映射的支持对于实现这一工作至关重要。

虽然OffsetDateTime没有直接实现IComparable,但是可以使用OffsetDateTime.Comparer.Instant对它们进行比较。这在LINQ查询中可能仍然很难使用,但这是一个值得探索的途径。

也许有人应该编写一个NHibernate-NodaTime集成包来简化这个过程。考虑到我以前为RavenDB脱衣舞做过这样的事情,我将考虑它。:)

抱歉,我没有更好的答案了。

更新

我开始着手这方面的工作,并成功地为OffsetDateTime构建了一个OffsetDateTime,但它不适用于比较操作符--这正是您描述的原因。我认为该解决方案涉及扩展linq提供程序,类似于描述的在这篇博客文章中技术。我还没有一个完整的工作例子,但我会更新这里,当我这样做。

最终,您将无法编写:

代码语言:javascript
复制
session.Query<Foo>().Where(x => x.SomeODT > value)

因为OffsetDateTime没有比较运算符,所以不会编译。

相反,应该扩展LINQ提供程序以支持以下内容:

代码语言:javascript
复制
session.Query<Foo>().Where(x => OffsetDateTime.Comparer.Instant.Compare(x.SomeODT, value) > 0)

或者也许更干净些,比如:

代码语言:javascript
复制
session.Query<Foo>().Where(x => x.SomeODT.ToInstant() > value.ToInstant())

或者两者都有。两者都会编译,但是在LINQ提供程序中没有适当的支持就会抛出异常。

第二次更新

有人比我早。现在有一组扩展用于NHibernate,以支持Noda时间数据类型在这个项目中。:)

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34452792

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档