2016-09-28 2 views
2

Je suis en train de relire une propriété DateTime? NULL, puis d'affecter cette valeur à une propriété de chaîne au format de date courte.Comment convertir une valeur datetime nullable en chaîne.empty lorsque datetime est null?

Je peux convertir la valeur d'heure de date en une chaîne de date courte et affecter à la propriété IT_Date_String. Mais je ne suis pas sûr comment affecter une valeur "" à la chaîne si le IT_Date est null.

Comment convertir un datetime? valeur à string.empty quand datetime? est nul?

Ceci est l'affectation dans LINQ:

var status_list = query_all.ToList().Select(r => new RelStatus 
{ 
    IT_Date_String = r.IT_Date.Value.ToString("yyyy-MM-dd") != null ? r.IT_Date.Value : null 
}).ToList(); 

Et les propriétés du modèle:

public DateTime? IT_Date { get; set; } 
public string IT_Date_String { get; set; } 

Répondre

11

Vous appelez la IT_Date.Value.ToString(...) indépendamment du fait que IT_Date a effectivement une valeur.

Vous avez donc besoin de tourner autour de l'expression:

r.IT_Date.HasValue ? r.IT_Date.Value.ToString(...) : "" 

De cette façon ToString() ne sera appelée lorsque IT_Date a une valeur.

Vous pouvez également implémenter dans le getter, comme mentionné dans un commentaire maintenant supprimé:

public string IT_Date_String 
{ 
    get 
    { 
     return IT_Date.HasValue ? IT_Date.Value.ToString(...) : ""; 
    } 
} 

De cette façon, vous ne devez réimplémenter la logique partout où vous accédez à ce modèle, et en prime , il sera seulement exécuté quand il est réellement demandé.

Il y a aussi no need to explicitly use String.Empty, the string "" will be interned to the same at runtime.

+0

J'aime l'idée d'injecter la conversion dans la propriété de modèle . Mais quand je l'ai fait, le devoir m'indique que "IT_Date_String" est en lecture seule. Ai-je besoin d'ajouter un setter à cette propriété string? –

+0

Comme: 'IT_Date_String = r.IT_Date' indique que l'affectation est en lecture seule. –

+0

Si vous voulez définir une date en affectant une chaîne à la propriété 'IT_Date_String', alors oui, vous avez également besoin d'un setter qui convertit la chaîne en DateTime et l'affecte à la propriété' IT_Date'. – CodeCaster

5

En C# 6, vous pouvez le faire:

IT_Date_String = r.IT_Date?.ToString("yyyy-MM-dd") ?? String.Empty; 

Les nouveaux ? vérifie si la chose à gauche est nulle, si elle est, l'expression est évaluée à null. Sinon, cela ne fait que continuer l'évaluation.

Ensuite, ?? vérifie si le résultat de la première expression est null, ce qui serait le cas si IT_Date est nul. Si c'est le cas, évaluer à String.Empty.

3

Avec C# 6.0 et la propagation null vous pouvez utiliser:

IT_Date_String = r.IT_Date?.ToString("yyyy-MM-dd") ?? String.Empty 
1

Celui-ci fonctionnera dans une version du cadre:

IT_Date_String=string.Format("{0:yyyy-MM-dd}",IT_Date); 
+0

Vrai, bien que «aaaa-MM-jj» soit plus valide, au moins en utilisant une compréhension de bon sens du suivi de date/heure. :) – decPL

+1

Merci d'avoir souligné cela, j'ai corrigé ma réponse. Probablement, il vaudrait mieux utiliser CultureInfo au lieu du pattern raw, mais c'était hors de question – cyberhubert