2016-12-14 7 views
0

Es scheint wie eine einfache Sache zu tun, aber EF unterstützt keine Eigenschaften wie DateTimeOffset.DateTime oder DateTimeOffset.LocalDateTime oder sogar DateTime.Date. Ich versuche, ein DateTimeOffset-Typenfeld nur durch die DateTime-Komponente (d. H. Die 'lokale' DateTime) zu filtern, was in simple sql: where cast(x as datetime) = '2016-12-14' eine einfache Sache ist.Wie wird datetimeoffset auf datetime im Entity-Framework umgesetzt?

Es gibt eine DbFunctions.TruncateTime, aber keine entsprechende TruncateOffset.

Es scheint einfach nicht möglich zu sein, ein -Objekt in ein normales DateTime-Objekt zu konvertieren, das in linq-to-entities funktioniert. Die einzige Konvertierung ist eine implizite von DateTime zu , aber nicht umgekehrt.

+0

'TruncateTime' hat zwei Überladungen' TruncateTime (Nullable ) 'und' TruncateTime (Nullable ) ' – Eldho

+0

, die beide die TIME verwerfen. Ich möchte die DateTime (Datum und Uhrzeit) eines DateTimeOffset ohne den Offset abrufen. Es ist völlig nutzlos, den Typ zu unterstützen, wenn Sie den DateTime-Teil von DateTimeOffset nicht erreichen können. Ein DateTimeOffset entspricht einem UTC DateTime, es trennt nur die DateTime vom Offset. Und wenn ich den DateTime-Teil des DateTimeOffset in EF nicht abfragen kann, ist es wertlos. Wie ich schon sagte, in einfachem SQL ist es einfach "cast (x as datetime)", wobei x ein DateTimeOffset-Feld ist. Sie benötigen wirklich eine TruncateOffset-Funktion. – Triynko

Antwort

0

hatte ich genau die gleiche Problem mit DbFunctions.TruncateTime und war in der Lage, es zu lösen DbFunctions.DiffDays

Hier ist mit einem Beispiel:

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

Wenn DbFunctions.DiffDays verwendet, wird der Offset nicht berücksichtigt. Hier ist die MSDN-Dokumentation: https://msdn.microsoft.com/en-us/library/dn220092(v=vs.113).aspx

+0

Wie hilft das bei der Beantwortung der OP-Frage? Wie haben Sie DiffDays verwendet, um die DateTime-Komponente aus einem DateTimeOffset zu entfernen? – RMD

+0

Ich hatte geschrieben: "Bei der Verwendung von DbFunctions.DiffDays wird der Offset nicht berücksichtigt". Das OP hatte ein Beispiel für: where cast (x als datetime) = '2016-12-14'. Du würdest das lösen mit: DbFunctions.DiffDays ('2016-12-14', x.EFTableDate) == 0 .. Ist das klar? – jspadea

0

Sie verwenden, um die DbFunctions.CreateDateTime abzustreifen den Offset, zum Beispiel:

... 
.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) 
... 

Wie Sie vielleicht vermuten, dies schafft eine wirklich schreckliche SQL, das heißt:

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] 

Allerdings wird es Ihnen geben, was Sie wollen.

Eine Einschränkung besteht darin, dass dies den Offset vollständig ausblendet/ignoriert (wie vom OP angefordert).

Verwandte Themen