2016-12-14 2 views
0

Cela semble être une chose simple à faire, mais EF ne supporte pas les propriétés comme DateTimeOffset.DateTime ou DateTimeOffset.LocalDateTime ou même DateTime.Date. J'essaie de filtrer un champ de type DateTimeOffset uniquement par le composant DateTime (c'est-à-dire le "DateTime" local), ce qui est une chose simple à faire dans SQL simple: where cast(x as datetime) = '2016-12-14'. Il existe un DbFunctions.TruncateTime, mais aucun TruncateOffset correspondant.Comment faire pour transmettre datetimeoffset à datetime dans l'infrastructure de l'entité?

Il ne semble tout simplement pas possible de convertir ou convertir un objet DateTimeOffset en un objet normal DateTime qui fonctionne dans linq-to-entities. La seule conversion est implicite de DateTime à DateTimeOffset, mais pas l'inverse.

+0

'TruncateTime' a deux surcharges' TruncateTime (Nullable ) 'et' TruncateTime (Nullable ) ' – Eldho

+0

Qui supprime le TIME. Je veux obtenir le DateTime (date et heure) d'un DateTimeOffset, sans le décalage. Il est complètement inutile de prendre en charge le type si vous ne pouvez pas obtenir à la partie DateTime du DateTimeOffset. Un DateTimeOffset est équivalent à un DateTime UTC, il sépare simplement le DateTime du Décalage. Et si je ne peux pas interroger la partie DateTime de la DateTimeOffset dans EF, cela ne vaut rien. Comme je l'ai dit, en langage SQL simple, c'est simplement 'cast (x as datetime)' où x est un champ DateTimeOffset. Ils ont vraiment besoin d'une fonction TruncateOffset. – Triynko

Répondre

0

J'ai eu exactement le même problème avec DbFunctions.TruncateTime et a été en mesure de le résoudre en utilisant DbFunctions.DiffDays

est un exemple:

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

Lorsque vous utilisez DbFunctions.DiffDays, le décalage ne sont pas prises en compte. Voici la documentation MSDN: https://msdn.microsoft.com/en-us/library/dn220092(v=vs.113).aspx

+0

Comment cela aide-t-il à répondre à la question du PO? Comment avez-vous utilisé DiffDays pour obtenir le composant DateTime d'un DateTimeOffset? – RMD

+0

J'avais écrit: "Lors de l'utilisation de DbFunctions.DiffDays, le décalage n'est pas pris en compte". L'OP a un exemple de: où cast (x as datetime) = '2016-12-14'. Vous résoudriez cela avec: DbFunctions.DiffDays ('2016-12-14', x.EFTableDate) == 0 .. Est-ce que cela clarifie? – jspadea

0

Vous pouvez utiliser le DbFunctions.CreateDateTime pour dépouiller le décalage, par exemple:

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

Comme vous pouvez l'imaginer, cela crée une SQL vraiment terrible, à savoir:

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] 

Cependant, il vous donnera ce que vous voulez. L'une des mises en garde est que ceci supprimera complètement/ignorera le décalage (comme demandé par l'OP).