日期:2014-05-17  浏览次数:21483 次

LINQ里的日期字符串比较
环境是VS2010,Silverlight4
数据库里的日期是字符型的,我要做的是查询两个日期之间,并符合用户名的结果。
好像LINQ里的两个字符串日期不能直接比较,必须转换成DateTime才可以。


DateTime? dtBegin = Convert.ToDateTime(dateBegin.Text);
DateTime? dtEnd = Convert.ToDateTime(dateEnd.Text);
 
context.Load(context.GetTB_SUMMARYCONTENTQuery().Where(r => r.USERNAME == username && Convert.ToDateTime(r.RECORDDATE).CompareTo(dateBegin) > 0 && Convert.ToDateTime(r.RECORDDATE).CompareTo(dtEnd) < 0));


可这么写运行的时候总是提示

[ExpressionTypeDoesNotMatchMethodParameter]
参数: System.Nullable`1[System.DateTime],System.Object,Int32 CompareTo(System.Object)
调试资源字符串不可用。密钥和参数通常提供足够的信息用以诊断该问题。请访问 http://go.microsoft.com/fwlink/?linkid=106663&Version=4.1.10111.0&File=System.Core.dll&Key=ExpressionTypeDoesNotMatchMethodParameter

   位于 System.ServiceModel.DomainServices.Client.WebDomainClient`1.BeginQueryCore(EntityQuery query, AsyncCallback callback, Object userState)
   位于 System.ServiceModel.DomainServices.Client.DomainClient.BeginQuery(EntityQuery query, AsyncCallback callback, Object userState)
   位于 System.ServiceModel.DomainServices.Client.DomainContext.Load(EntityQuery query, LoadBehavior loadBehavior, Action`1 callback, Object userState)
   位于 Silverlight4.Views.view.btnSearch_Click(Object sender, RoutedEventArgs e)
   位于 System.Windows.Controls.Primitives.ButtonBase.OnClick()
   位于 System.Windows.Controls.Button.OnClick()
   位于 System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(MouseButtonEventArgs e)
   位于 System.Windows.Controls.Control.OnMouseLeftButtonUp(Control ctrl, EventArgs e)
   位于 MS.Internal.JoltHelper.FireEvent(IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex, Int32 actualArgsTypeIndex, String eventName)



我把服务端的Silverlight的调试给禁止了(在xxx.web项目的属性,web,调试器里的silverlight的钩钩去掉了),是不是这个原因导致的呢?可是其他页面运行都没问题。主要是我不去掉的话根本就不能浏览页面,可能是哪里配置有问题,在单位都是正常的,在家必须要把服务端silverlight调试禁止才可以。

------解决方案--------------------
看错误信息应该是时间为空的情况没有处理吧,DateTime.CompareTo(DateTime) 方法接收的参数不是可空的,所以一旦传个null进去,就会报这个错了吧。
既然定义为可空类型,所以你应该先判断dateBegin,dateEnd是否为空:如果为空应该有套逻辑去处理,比如给个默认值或者干脆就不比较什么的;不为空的时候再用Convert.ToDateTime(r.RECORDDATE).CompareTo(dateBegin.value)去比较。
至于和silverlight调试的关系,我也不太清楚,没搞过,我猜是因为某些动作导致没法正确的从页面或得到时间值,导致转换为DateTime时为空了吧。