在c#中返回可以为空的日期的正确方法是什么?

时间:2013-10-11 09:07:56

标签: c# wcf datetime null nullable

我有一个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,但我想干净利落地完成这个。

3 个答案:

答案 0 :(得分:1)

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

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

如果没有记录,Max会在没有记录的情况下抛出异常。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

我同意wiero,看起来在执行期间抛出了一些异常。要在客户端获得异​​常,您可以使用web.config中的IncludeExceptionDetailInFaults参数打开异常转移(例如,查看Turn on IncludeExceptionDetailInFaults (either from ServiceBehaviorAttribute or from the <serviceDebug> configuration behavior) on the server;但最好在生产时关闭它。)

如果您收到此异常详细信息,则可以更轻松地了解问题所在。