这似乎很简单,但EF并不支持DateTimeOffset.DateTime
或DateTimeOffset.LocalDateTime
或DateTime.Date
等属性。我试图仅通过DateTime组件过滤DateTimeOffset类型字段(即' local' DateTime),这在普通的sql中是一件简单的事情:where cast(x as datetime) = '2016-12-14'
。
有一个DbFunctions.TruncateTime
,但没有相应的TruncateOffset
。
似乎没有任何方法可以将DateTimeOffset
对象转换或转换为在linq-to-entities中工作的普通DateTime
对象。唯一的转化是从DateTime
到DateTimeOffset
的隐式转化,但不是相反。
答案 0 :(得分:0)
pipe
我遇到了完全相同的问题,并且能够使用DbFunctions.TruncateTime
解决问题
以下是一个例子:
DbFunctions.DiffDays
使用DbFunctions.DiffDays时,不考虑偏移量。以下是MSDN文档:https://msdn.microsoft.com/en-us/library/dn220092(v=vs.113).aspx
答案 1 :(得分:0)
您可以使用 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请求的那样)。