2016-11-24 48 views
4

我的視圖模型有一個可爲空日期屬性,如...如何使用空合併運算符可空日期

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

但是當我嘗試使用空合併運算符,如...

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

我得到以下錯誤...

運營商 '?'不能應用於類型「日期時間」和 「日期時間」

的操作數我想這應該工作,因爲我把我的財產日期可空和this post表明,它應該工作了。我究竟做錯了什麼?

UPDATE

爲了讓更多的清晰度我想用空coaslescing分配,這將在我的數據庫更新日期時間字段一個小巧玲瓏的參數。該字段可以接受空值或日期時間值。基本上,如果用戶指定一個日期,然後分配提供日期參數以其他方式轉讓空...

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

請注意,我必須做的UTC轉換,因爲我使用SQL Azure的,它使用UTC的日期,否則我的時間超過了11個小時(我在澳大利亞),如果我只是從我的本地系統傳遞數據。在SQL中,我正在使用一個函數來將日期偏移到我的時區,然後更新表。

我目前的解決方案讓它工作在低於但不確定這是否是最乾淨的方式。將是很好的一個一線得到...

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

您的問題並不完全合理。爲了嘗試理解它(對於我們和你),嘗試刪除你的var並且包含一個實際的類型 - 你希望你的輸出是什麼? – Paddy

+1

'SanctionExpires'是一個'可空的',但'SanctionExpires.Value'是'DateTime'。 –

+0

當'model.SanctionExpires'爲'null'時,'test'需要*什麼值? (你會得到*這個代碼(如果它編譯)是一個NullReferenceException) –

回答

9

.Value可爲空假設它不能爲空。因此,將無效和禁止應用空合併運算符。

你可以使用這樣的操作,但會在你的代碼,我不知道這是否是你所需要的:

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

對於您的更新:您可以通過快捷鍵即評價是這樣的:

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

我已經更新了我的問題,以更好地解釋我的目標。是否可以在一行中存檔或者這是否是最乾淨的選項... 'if(model.SanctionExpires == null) \t \t p.Add(「@ SanctionExpires」,model.SanctionExpires); \t其他 \t \t p.Add( 「@ SanctionExpires」,model.SanctionExpires.Value.ToUniversalTime());' – OjM

+0

@OjM看到我的更新答案 –

+0

感謝您的一個班輪完美。我的最後一行代碼是'p.Add(「@ SanctionExpires」,model.SanctionExpires?.ToUniversalTime()?? model.SanctionExpires);' – OjM

0

如果您的DateTime對象爲空,您也可以使用GetValueOrDefault方法返回默認值值。如果您想使用實際日期,則應使用DateTime.Now

例如下面的代碼可以幫助你:

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

如果調用GetValueOrDefault沒有PARAMS它將使用default(DateTime)如果你的日期時間爲空

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

更新

如果您正在使用C#5。0或以下,您可以使用以下代碼片段,因爲NULL conditional operator在C#6.0之前不可用。

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