LINQ to SQL数据上下文 - 日期属性 - 将DateTImeKind未指定日期更改为本地日期

时间:2013-07-04 10:04:47

标签: .net linq linq-to-sql .net-4.0 datacontext

我有一个LINQ to SQL数据上下文,其中包含一个具有两个Date属性的类:

DateActive DateTime NOT NULL
DateInactive DateTime NULL

MSDN明确指出:

  

LessThanOrEqual运算符通过比较它们的刻度数来确定两个DateTime值之间的关系。在比较DateTime对象之前,请确保对象表示同一时区中的时间。您可以通过比较Kind属性的值来完成此操作。

http://msdn.microsoft.com/en-us/library/system.datetime.op_lessthanorequal.aspx

但在我的LINQ查询中,上述两个字段显示为DateTimeKind.Unspecified,我将Date.TodayDateTimeKind.Local进行比较。

是否有一种很好的方法可以在整个应用程序中将上述属性指定为DateTimeKind.Local,这样我就无需像i.DateActive.ToLocalTime.Datei.DateInactive.Value.ToLocalTime.Date那样进行转换?

我使用的是.NET 4而不是.NET 4.5,所以我认为同样适用。

1 个答案:

答案 0 :(得分:2)

MSDN文章讨论了比较客户端日期。 Linq To SQL将您的语句转换为SQL,其中未使用DateTimeKind属性。

您应该使用DateTimeOffset而不是DateTime。这将允许您use DateTimeOffset methods in SQL并利用SQL Server中的DATETIMEOFFSET类型。

LINQ to SQL生成SQL语句。 System.DateTime和SQL Server的DATETIME类型没有时区信息,因此尝试考虑时区是没有意义的。这两个值都不包含任何时区,那么如何进行任何自动转换?

您问题中的两个DateTime值来自两个不同的来源。 DateTime.Today来自当地机器,时区已知,因此DateTimeKind.Local

数据库列虽然来自数据库,但来自不包含时区信息的数据类型。 DateTimeKind.Unspecified是正确的值。顺便说一句,你在存储到数据库时假设的时区是什么?世界标准时间?你当地的时区?夏天还是冬天?

如果要继续使用DateTime类型,则必须将日期时间参数转换为客户端上的正确时区。数据库字段之间的比较不需要任何转换,因为它们转换为的SQL不依赖于时区。

如果您想支持不同的时区,则必须切换到DateTimeOffset类型。

当然,您可以假设所有数据共享相同的时区并忽略任何差异,在这种情况下,DateTime就足够了。