2016-11-24 3 views
4
modèle

Ma vue a une propriété date annulable tels que ...Comment utiliser l'opérateur coalescent null avec la date annulable

[DataType(DataType.Date)] 
public DateTime? SanctionExpires { get; set; } 

Mais lorsque je tente d'utiliser l'opérateur null-coalescent tels que ...

var test = model.SanctionExpires.Value.ToUniversalTime() ?? model.SanctionExpires; 

Je reçois l'erreur suivante ...

opérateur '??' ne peut pas être appliquée aux opérandes de type « datetime » et « datetime »

Je pensais que cela devrait fonctionner parce que je tournerai ma propriété date à nullable et this post suggère qu'il devrait fonctionner aussi. Qu'est-ce que je fais mal?

MISE À JOUR

Pour donner plus de clarté, je veux utiliser null-coaslescing pour affecter un paramètre Dapper qui mettra à jour un champ DateTime dans ma base de données. Le champ peut accepter des valeurs nulles ou des valeurs datetime. En gros, si un utilisateur spécifie une date puis attribuez-lui la date prévue au paramètre autrement affecter null ...

p.Add("@SanctionExpires", model.SanctionExpires.Value.ToUniversalTime() ?? model.SanctionExpires); 

Notez que je dois faire la conversion UTC parce que je suis en utilisant SQL Azure qui utilise UTC pour les dates autrement mon temps est de 11 heures (je suis en Australie) si je viens de transmettre une donnée de mon système local. En sql j'utilise une fonction pour décaler la date à mon fuseau horaire avant de mettre à jour la table.

Ma solution actuelle pour le faire fonctionner est ci-dessous, mais je ne sais pas si c'est la façon la plus propre. Ce serait bien d'obtenir en une ligne ...

if (model.SanctionExpires == null) 
    p.Add("@SanctionExpires", model.SanctionExpires); 
else 
    p.Add("@SanctionExpires", model.SanctionExpires.Value.ToUniversalTime()); 
+0

Votre question n'a pas vraiment de sens. Pour essayer de comprendre cela (pour nous et vous), essayez de supprimer votre var et d'inclure un type réel - que voulez-vous que votre sortie soit? – Paddy

+1

'SanctionExpires' est un' Nullable ', mais' SanctionExpires.Value' est un 'DateTime'. –

+0

Lorsque 'model.SanctionExpires' est' null', quelle valeur * voulez-vous * pour 'test'? (Ce que vous obtiendriez * avec * ce code (s'il était compilé) est une exception NullReferenceException) –

Répondre

9

.Value sur annulable suppose qu'il ne peut pas être nulle. D'où l'application de l'opérateur null-coalescent sur elle inutile et interdite.

Vous pouvez utiliser l'opérateur comme ça, mais aller sur votre code, je ne sais pas si c'est ce que vous avez besoin:

DateTime test = (model.SanctionExpires ?? DateTime.Now).ToUniversalTime(); 

Pour votre mise à jour: vous pouvez raccourci cette évaluation comme ceci:

DateTime? test = model.SanctionExpires?.ToUniversalTime(); 
+0

J'ai mis à jour ma question pour mieux expliquer mon objectif. Est-il possible d'obtenir en une ligne ou serait-ce l'option la plus propre ... 'if (model.SanctionExpires == null) \t \t p.Ajouter (" @ SanctionExpires ", model.SanctionExpires); \t d'autre \t \t p.Add ("@", SanctionExpires model.SanctionExpires.Value.ToUniversalTime()); ' – OjM

+0

@OjM voir ma réponse mis à jour grâce –

+0

votre seule ligne fonctionne parfaitement. ma dernière ligne de code est 'p.Add (" @ SanctionExpires ", model.SanctionExpires? .ToUniversalTime() ?? model.SanctionExpires);' – OjM

0

Vous pouvez également utiliser la méthode GetValueOrDefault pour renvoyer valeur par défaut si votre objet DateTime est null. Dans le cas où vous souhaitez utiliser la date réelle, vous devez utiliser DateTime.Now.

Par exemple extrait de code suivant peut vous aider:

var defaultDateTime = DateTime.Now; 
var dateTime = model.SanctionExpires.GetValueOrDefault(defaultDateTime).ToUniversalTime(); 

Si vous appelez GetValueOrDefault sans params il utilisera default(DateTime) si votre DateTime est nul

var dateTime = model.SanctionExpires.GetValueOrDefault().ToUniversalTime(); //dateTime == default(DateTime) in case !model.SanctionExpires.HasValue 

Mise à jour

Si vous utilisez C# 5.0 ou ci-dessous vous pouvez utiliser l'extrait de code suivant car NULL conditional operator est disponible avant C# 6.0.

p.Add("@SanctionExpires", !model.SanctionExpires.HasValue ? null : (DateTime?)model.SanctionExpires.Value.ToUniversalTime());