2016-12-14 85 views
0

這似乎很簡單,但EF不支持DateTimeOffset.DateTimeDateTimeOffset.LocalDateTime甚至DateTime.Date等屬性。我試圖只通過DateTime組件(即'本地'DateTime)來過濾DateTimeOffset類型字段,這在簡單的sql中是一件簡單的事情:where cast(x as datetime) = '2016-12-14'如何在實體框架中將datetimeoffset轉換爲datetime?

有一個DbFunctions.TruncateTime,但沒有相應的TruncateOffset

似乎沒有任何方法可以將DateTimeOffset對象投射或轉換爲在linq-to-entities中工作的普通DateTime對象。唯一的轉換是從DateTimeDateTimeOffset的隱式轉換,但不是相反。

+0

'TruncateTime'有兩個重載'TruncateTime(Nullable )'和'TruncateTime(Nullable )' – Eldho

+0

它們都放棄了TIME。我想獲取DateTimeOffset的DateTime(包括日期和時間),沒有偏移量。如果無法獲取DateTimeOffset的DateTime部分,則支持該類型是完全沒有用的。 DateTimeOffset等同於UTC DateTime,它將DateTime與Offset分開。如果我無法查詢EF中DateTimeOffset的DateTime部分,它就毫無價值。像我說的,在普通的SQL中,它只是'cast(x as datetime)',其中x是一個DateTimeOffset字段。他們確實需要一個TruncateOffset函數。 – Triynko

回答

0

我有完全相同的問題DbFunctions.TruncateTime,並可被DbFunctions.DiffDays

這裏來解決這個問題就是一個例子:

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

當使用DbFunctions.DiffDays,偏移量不考慮。下面是MSDN文檔:https://msdn.microsoft.com/en-us/library/dn220092(v=vs.113).aspx

+0

這有助於回答OP的問題嗎?您是如何從使用DiffDays實際將DateTime組件從DateTimeOffset中取出的? – RMD

+0

我寫過:「使用DbFunctions.DiffDays時,不考慮偏移量」。 OP有一個例子:where cast(x as datetime)='2016-12-14'。你會解決這個問題:DbFunctions.DiffDays('2016-12-14',x.EFTableDate)== 0 ..這是否澄清? – jspadea

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要求)。

相關問題