【问题标题】:How to use null-coalescing operator with nullable date如何使用可空日期的空合并运算符
【发布时间】:2017-04-08 19:25:41
【问题描述】:

我的视图模型有一个可以为空的日期属性,例如...

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

但是当我尝试使用 null-coalescing 运算符时...

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

我收到以下错误...

运算符'??'不能应用于“日期时间”类型的操作数和 '日期时间'

我认为这应该可以工作,因为我将 date 属性设置为可为空,this post 建议它也应该可以工作。我做错了什么?

更新

为了更清楚,我想使用 null-coaslescing 来分配一个 Dapper 参数,该参数将更新我数据库中的 DateTime 字段。该字段可以接受空值或日期时间值。基本上,如果用户指定日期,则将提供的日期分配给参数,否则分配 null...

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

请注意,我必须进行 UTC 转换,因为我使用的是使用 UTC 作为日期的 SQL Azure,否则如果我只是从本地系统传递数据,我的时间将超过 11 小时(我在澳大利亚)。在 sql 中,我使用一个函数在更新表之前将日期偏移到我的时区。

我目前的解决方案如下,但不确定这是否是最干净的方法。能排成一行就好了……

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

【问题讨论】:

  • 您的问题并不完全有道理。要尝试理解它(对我们和您而言),请尝试删除您的 var 并包含一个实际类型 - 您希望输出是什么?
  • SanctionExpiresNullable<DateTime>,但 SanctionExpires.ValueDateTime
  • model.SanctionExpiresnull 时,您想要 test 的值是多少? (使用此代码(如果已编译)您会得到的是 NullReferenceException)

标签: c# asp.net-mvc datetime asp.net-core nullable


【解决方案1】:

.Value 在可空值上假定它不能为空。因此,对它应用空合并运算符是无用且被禁止的。

你可以像这样使用操作符,但是继续你的代码我不确定这是否是你需要的:

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

对于您的更新:您可以像这样简化评估:

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

【讨论】:

  • 我更新了我的问题以更好地解释我的目标。是否有可能在一行中实现,或者这是最干净的选择...if (model.SanctionExpires == null) p.Add("@SanctionExpires", model.SanctionExpires); else p.Add("@SanctionExpires", model.SanctionExpires.Value.ToUniversalTime());
  • 感谢您的一个班轮完美运行。我的最后一行代码是p.Add("@SanctionExpires", model.SanctionExpires?.ToUniversalTime() ?? model.SanctionExpires);
【解决方案2】:

如果您的 DateTime 对象为空,您也可以使用 GetValueOrDefault 方法返回 默认 值。如果你想使用实际日期,你应该使用DateTime.Now

例如下面的代码 sn -p 可以帮助你:

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

如果您在没有参数的情况下调用 GetValueOrDefault,如果您的 DateTime 为空,它将使用 default(DateTime)

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

更新

如果您使用的是 C#5.0 或更低版本,则可以使用以下代码 sn-p,因为 NULL conditional operator 在 C#6.0 之前不可用。

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

【讨论】:

    猜你喜欢
    • 2012-09-19
    • 2013-09-13
    • 1970-01-01
    • 2010-09-25
    • 2010-12-19
    • 2019-03-01
    • 2017-11-24
    • 2017-05-31
    • 2011-02-13
    相关资源
    最近更新 更多