bil*_*ill 10 c# linq-to-entities sql-server-2005 sql-server-2008
我有一个为2008年写的应用程序.
我们正在使用linq实体.
我们现在必须将数据库切换到2005.我在linq SELECT查询中收到以下错误:
错误 - SqlDateTime溢出.必须在1/1/1753 12:00:00 AM和12/31/9999 11:59:59 PM之间.
违规行是:
DateOfBirth = ((s.Date_Of_Birth == null) || (s.Date_Of_Birth <= lowdate)) ?
DateTime.MinValue : s.Date_Of_Birth.Value,
Run Code Online (Sandbox Code Playgroud)
DateOfBirth是DateTime类型,是我们自己的业务对象(非实体)中的属性.
任何人都知道如何修改此行以使此查询运行?
Ree*_*sey 14
确保lowdate至少是1/1/1753.
如果您尝试提供之前的日期,EF会将其转换,并将其传递给您的查询.此外,您不需要DateTime.MinValue在查询中使用,而是您的min:
DateOfBirth = ((s.Date_Of_Birth == null) || (s.Date_Of_Birth <= lowdate)) ?
new DateTime(1753,1,1) : s.Date_Of_Birth.Value;
Run Code Online (Sandbox Code Playgroud)
请记住,使用EF,查询将在服务器上进行编译并转换为SQL,因此这些值也必须适合.
话虽这么说,我个人更喜欢存储DateOfBirth为DateTime?(可空类型)而不是使用"魔术值"(DateTime.MinValue)来保存数据库null或不适当的值.
另外,为了在这里添加好的答案,请尝试使用SqlDateTime.MinValue而不是1/1/1973或DateTime.MinValue.
http://msdn.microsoft.com/en-us/library/system.data.sqltypes.sqldatetime.minvalue.aspx
当然,它与1973年1月1日的情况相同,但它更清洁,更不那么神奇.
尝试(DateTime)SqlDateTime.MinValue改用:
DateOfBirth = ((s.Date_Of_Birth == null) || (s.Date_Of_Birth <= lowdate)) ?
(DateTime)SqlDateTime.MinValue : s.Date_Of_Birth.Value,
Run Code Online (Sandbox Code Playgroud)
您将需要包括:
using System.Data.SqlTypes;
Run Code Online (Sandbox Code Playgroud)
如果您仍想使用非空日期字段,则可以解决此问题。但是,正如其他人所提到的,最好使用null日期字段。
| 归档时间: |
|
| 查看次数: |
34880 次 |
| 最近记录: |