用c#返回可为空日期的正确方法是什么?
我有一个WCF服务,它应该从某个范围返回特定机器的最大日志日期,或者如果该机器没有日志条目,则返回null:用c#返回可为空日期的正确方法是什么?,c#,wcf,datetime,null,nullable,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
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,但我想清楚地做到这一点
DateTime? latestEvent = (from be in itdb.tl_sta_bootTimes
where be.machineName.ToUpper() == laptopName.ToUpper()
select be.timestamp
).DefaultIfEmpty(null).Max();
如果没有记录,将抛出一个没有它的异常。您需要将查询中的时间戳转换为可为空的日期时间,即
DateTime? latestEvent = (from be in itdb.tl_sta_bootTimes
where be.machineName.ToUpper() == laptopName.ToUpper()
select (DateTime?)be.timestamp
).Max();
我同意wiero的观点,看起来在执行过程中抛出了一些异常。要在客户端获取异常,您可以使用web.config中的IncludeExceptionDetailInFaults参数打开异常传输(例如,请看;不过最好在生产环境中关闭它)
如果您获得此异常详细信息,将更容易理解问题所在。您可以打开跟踪以查看错误代码是否正常,我会胡乱猜测,说集合没有元素,max thorws a exceptionReturning nullable DateTime在wcfI中非常好。我看不出有任何理由相信该错误与nullable类型有关。您确定服务器方法中的其他内容不只是引发异常吗?我不确定这是不是约会时间的回归?这就是问题所在。如果时间戳不是日期时间?代码已经无法编译了。