Entity framework 6 如何在实体框架中将datetimeoffset转换为datetime?

Entity framework 6 如何在实体框架中将datetimeoffset转换为datetime?,entity-framework-6,datetimeoffset,Entity Framework 6,Datetimeoffset,这看起来很简单,但EF不支持像DateTimeOffset.DateTime或DateTimeOffset.LocalDateTime或甚至DateTime.Date这样的属性。我试图仅通过DateTime组件(即“本地”DateTime)过滤DateTimeOffset类型字段,这在普通sql中很简单:where cast(x as DateTime)=“2016-12-14” 存在一个DbFunctions.TruncateTime,但没有相应的TruncateOffset 似乎没有任何方法

这看起来很简单,但EF不支持像
DateTimeOffset.DateTime
DateTimeOffset.LocalDateTime
或甚至
DateTime.Date
这样的属性。我试图仅通过DateTime组件(即“本地”DateTime)过滤DateTimeOffset类型字段,这在普通sql中很简单:
where cast(x as DateTime)=“2016-12-14”

存在一个
DbFunctions.TruncateTime
,但没有相应的
TruncateOffset


似乎没有任何方法可以将
DateTimeOffset
对象强制转换或转换为正常的
DateTime
对象,该对象在linq to实体中工作。唯一的转换是从
DateTime
DateTimeOffset
的隐式转换,但不是相反。

我对
DbFunctions.TruncateTime
有完全相同的问题,并且能够使用
DbFunctions.DiffDays

以下是一个例子:

DbFunctions.DiffDays(DateTimeOffset.Now, x.EventDate) == 0

使用DbFunctions.DiffDays时,不考虑偏移量。以下是MSDN文档:

您可以使用DbFunctions.CreateDateTime来去除偏移量,例如:

...
.Select(e => new MyClass {                                      
  MyDate = DbFunctions.CreateDateTime(e.MyDateTimeOffset.Year,
                                      e.MyDateTimeOffset.Month,
                                      e.MyDateTimeOffset.Day,
                                      e.MyDateTimeOffset.Hour,
                                      e.MyDateTimeOffset.Minute,
                                      e.MyDateTimeOffset.Second)
...
正如您可能怀疑的那样,这会创建一些非常糟糕的SQL,即:

convert (datetime2,right('000' + convert(varchar(255), DATEPART (year, [Extent1].[MyDateTimeOffset])), 4) + '-' + convert(varchar(255), DATEPART (month, [Extent1].[MyDateTimeOffset])) + '-' + convert(varchar(255), DATEPART (day, [Extent1].[MyDateTimeOffset])) + ' ' + convert(varchar(255), DATEPART (hour, [Extent1].[MyDateTimeOffset])) + ':' + convert(varchar(255), DATEPART (minute, [Extent1].[MyDateTimeOffset])) + ':' + str( CAST( DATEPART (second, [Extent1].[MyDateTimeOffset]) AS float), 10, 7), 121) AS [C2]
然而,它会给你你想要的


一个警告是,这将完全去除/忽略偏移量(根据OP请求)。

TruncateTime
有两个重载
TruncateTime(Nullable)
TruncateTime(Nullable)
,它们都放弃了时间。我想获取DateTimeOffset的DateTime(日期和时间),不带偏移量。如果无法获取DateTimeOffset的DateTime部分,则支持该类型是完全无用的。DateTimeOffset相当于UTC DateTime,它只是将DateTime与偏移分开。如果我不能在EF中查询DateTimeOffset的DateTime部分,那么它就一文不值了。正如我所说,在普通SQL中,它只是
cast(x为datetime)
其中x是DateTimeOffset字段。他们真的需要一个TruncateOffset函数。这对回答OP的问题有什么帮助?您是如何从使用DiffDays到实际从DateTimeOffset中获取DateTime组件的?我曾写道:“当使用DbFunctions.DiffDays时,不考虑偏移量”。OP有一个例子:where cast(x为datetime)='2016-12-14'。您可以通过以下方法解决此问题:DbFunctions.DiffDays('2016-12-14',x.EFTableDate)==0。。明白了吗?明白了-很有道理-我把注意力集中在DateTime的转换上,没有注意到他想在where子句中使用这个。但这并没有将datetimeoffset转换为本地DateTime,它只是使用datetimeoffset的值。