如何对可为空的日期使用空合并运算符
How to use null-coalescing operator with nullable date
我的视图模型有一个可以为 null 的日期 属性 例如...
[DataType(DataType.Date)]
public DateTime? SanctionExpires { get; set; }
但是当我尝试使用空合并运算符时...
var test = model.SanctionExpires.Value.ToUniversalTime() ?? model.SanctionExpires;
我收到以下错误...
operator '??' cannot be applied to operands of type 'datetime' and
'datetime'
我认为这应该可行,因为我将我的日期 属性 设置为可为空并且 this post 建议它也应该可行。我做错了什么?
更新
为了更加清晰,我想使用 null-coaslescing 来分配一个 Dapper 参数,该参数将更新我数据库中的 DateTime 字段。该字段可以接受空值或日期时间值。基本上,如果用户指定日期,则将提供的日期分配给参数,否则分配 null...
p.Add("@SanctionExpires", model.SanctionExpires.Value.ToUniversalTime() ?? model.SanctionExpires);
请注意,我必须进行 UTC 转换,因为我使用的是 SQL Azure,它使用 UTC 日期,否则我的时间将超过 11 小时(我在澳大利亚),如果我只是通过一个来自我本地系统的数据。在 sql 中,我在更新 table.
之前使用函数将日期偏移到我的时区
我目前的解决方案如下,但不确定这是否是最干净的方法。能排成一行就好了...
if (model.SanctionExpires == null)
p.Add("@SanctionExpires", model.SanctionExpires);
else
p.Add("@SanctionExpires", model.SanctionExpires.Value.ToUniversalTime());
.Value
上可空假定它不能为空。因此,在其上应用空合并运算符是无用且被禁止的。
您可以像这样使用运算符,但是继续您的代码我不确定这是否是您需要的:
DateTime test = (model.SanctionExpires ?? DateTime.Now).ToUniversalTime();
对于您的更新:您可以像这样简化评估:
DateTime? test = model.SanctionExpires?.ToUniversalTime();
如果您的 DateTime 对象为 null,您还可以使用 GetValueOrDefault
方法来 return 默认 值。如果您想使用实际日期,您应该使用 DateTime.Now
.
例如,以下代码片段可以帮助您:
var defaultDateTime = DateTime.Now;
var dateTime = model.SanctionExpires.GetValueOrDefault(defaultDateTime).ToUniversalTime();
如果您在没有参数的情况下调用 GetValueOrDefault
,如果您的 DateTime 为 null
,它将使用 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());
我的视图模型有一个可以为 null 的日期 属性 例如...
[DataType(DataType.Date)]
public DateTime? SanctionExpires { get; set; }
但是当我尝试使用空合并运算符时...
var test = model.SanctionExpires.Value.ToUniversalTime() ?? model.SanctionExpires;
我收到以下错误...
operator '??' cannot be applied to operands of type 'datetime' and 'datetime'
我认为这应该可行,因为我将我的日期 属性 设置为可为空并且 this post 建议它也应该可行。我做错了什么?
更新
为了更加清晰,我想使用 null-coaslescing 来分配一个 Dapper 参数,该参数将更新我数据库中的 DateTime 字段。该字段可以接受空值或日期时间值。基本上,如果用户指定日期,则将提供的日期分配给参数,否则分配 null...
p.Add("@SanctionExpires", model.SanctionExpires.Value.ToUniversalTime() ?? model.SanctionExpires);
请注意,我必须进行 UTC 转换,因为我使用的是 SQL Azure,它使用 UTC 日期,否则我的时间将超过 11 小时(我在澳大利亚),如果我只是通过一个来自我本地系统的数据。在 sql 中,我在更新 table.
之前使用函数将日期偏移到我的时区我目前的解决方案如下,但不确定这是否是最干净的方法。能排成一行就好了...
if (model.SanctionExpires == null)
p.Add("@SanctionExpires", model.SanctionExpires);
else
p.Add("@SanctionExpires", model.SanctionExpires.Value.ToUniversalTime());
.Value
上可空假定它不能为空。因此,在其上应用空合并运算符是无用且被禁止的。
您可以像这样使用运算符,但是继续您的代码我不确定这是否是您需要的:
DateTime test = (model.SanctionExpires ?? DateTime.Now).ToUniversalTime();
对于您的更新:您可以像这样简化评估:
DateTime? test = model.SanctionExpires?.ToUniversalTime();
如果您的 DateTime 对象为 null,您还可以使用 GetValueOrDefault
方法来 return 默认 值。如果您想使用实际日期,您应该使用 DateTime.Now
.
例如,以下代码片段可以帮助您:
var defaultDateTime = DateTime.Now;
var dateTime = model.SanctionExpires.GetValueOrDefault(defaultDateTime).ToUniversalTime();
如果您在没有参数的情况下调用 GetValueOrDefault
,如果您的 DateTime 为 null
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());