【问题标题】:What is the correct way to return a nullable date in c#?在 c# 中返回可空日期的正确方法是什么?
【发布时间】:2013-10-11 17:25:18
【问题描述】:

我有一个 WCF 服务,它应该从某个范围内返回特定机器的最大日志日期,如果该机器没有日志条目,则返回 null:

    public DateTime? GetLastBootEvent(string laptopName)
    {
       ITDashboardDataContext itdb = new ITDashboardDataContext();

       DateTime? latestEvent = (from be in itdb.tl_sta_bootTimes
                       where be.machineName.ToUpper() == laptopName.ToUpper()
                       select be.timestamp
                       ).Max();

      return latestEvent;

   }

但是,当我运行它时,我收到以下错误:

“由于内部错误,服务器无法处理请求。有关该错误的详细信息, 在服务器上打开 IncludeExceptionDetailInFaults(来自 ServiceBehaviorAttribute 或来自配置行为)以发送 异常信息返回给客户端,或根据 Microsoft .NET Framework SDK 文档打开跟踪并检查服务器跟踪日志。"

那里没有太多信息。我想通过使用DateTime? 而不是DateTime 这应该允许返回空值?

我可以通过返回一些过去的随机日期的方法来处理这个问题,比如 MinDate,但我想干净利落地做到这一点。

【问题讨论】:

  • 您可以打开跟踪查看错误stackoverflow.com/questions/4271517/how-to-turn-on-wcf-tracing 代码看起来没问题,我会大胆猜测并说集合没有元素并且最大允许异常
  • 在 wcf 中返回可为空的 DateTime 非常好
  • 我看不出有任何理由相信该错误与可空类型有关。
  • 您确定您的服务器方法中的其他内容不只是抛出异常吗?我不确定这是日期时间的回归吗?这就是问题所在。

标签: c# wcf datetime null nullable


【解决方案1】:

您需要将查询中的时间戳转换为可为空的日期时间,即

DateTime? latestEvent = (from be in itdb.tl_sta_bootTimes
                       where be.machineName.ToUpper() == laptopName.ToUpper()
                       select (DateTime?)be.timestamp
                       ).Max();

【讨论】:

  • 如果时间戳不是日期时间?代码已经无法编译了。
【解决方案2】:

听起来你想在这里使用DefaultIfEmpty,例如

DateTime? latestEvent = (from be in itdb.tl_sta_bootTimes
                         where be.machineName.ToUpper() == laptopName.ToUpper()
                         select be.timestamp
                        ).DefaultIfEmpty(null).Max();

如果没有记录Max没有它会抛出异常。

【讨论】:

    【解决方案3】:

    我同意 wiero 的观点,看起来在执行过程中引发了一些异常。要在客户端获取异常,您可以使用 web.config 中的 IncludeExceptionDetailInFaults 参数打开异常传输(例如,查看 Turn on IncludeExceptionDetailInFaults (either from ServiceBehaviorAttribute or from the <serviceDebug> configuration behavior) on the server;但是最好在生产环境中将其关闭)。

    如果您获得此异常详细信息,将更容易理解问题出在哪里。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-23
      • 1970-01-01
      • 1970-01-01
      • 2011-04-26
      • 2022-11-14
      • 2016-11-05
      相关资源
      最近更新 更多