作者kenshinn (子凌--找不到生活重心)
看板C_Sharp
标题[心得] Linq 未实作的功能
时间Mon Jul 7 23:00:59 2008
观看原始部落格有较佳的排版:
http://kenshinnn.blogspot.com/2008/07/linq.html
今天追一个问题,追了半天,原本程式码如下:
MyContext context = new MyContext();
int count = context.Logs.Count(m => m.CreateDate.Value.ToShortDateString() ==
DateTime.Today.ToShortDateString());
上面的式子在使用了 linq to Sql, 其中 Logs 资料表中有一个栏位 CreateDate 是
Sql 的 DateTime 型别,在 lamba Expression 中,把它当做 DateTime 型别使用,於是
使用了 ToShortDateString 这个方法,编译一切正常,但执行时,却发生了例外。
不死心的,将上述的式子改为:
MyContext context = new MyContext();
int count = context.Logs.Count(m => m.CreateDate.Value.ToString("yyyyMMdd")
== DateTime.Today.ToString("yyyyMMdd"));
依然出错,最後只好将式子改为
MyContext context = new MyContext();
int count = context.Logs.Count(m => m.CreateDate.Value.Date ==
DateTime.Today.Date);
才终於过关,但这一切过程都是 runTime 时才发生问题,原本强调 var 型别的动态性,
与强型别编译的好处,以减少错误的发生,但眼前却显得一切都不可靠。
最後终於在 msdn 中找到了答案:
http://msdn.microsoft.com/en-us/library/bb425822.aspx
节录最後面一段:
System.DateTime
Implemented
* Constructors:
Copy Code
DateTime(year, month, day)
DateTime(year, month, day, hour, minutes, seconds)
DateTime(year, month, day, hour, minutes, seconds, milliseconds)
* Operators:
Copy Code
Comparisons
DateTime – DateTime (gives TimeSpan)
DateTime + TimeSpan (gives DateTime)
DateTime – TimeSpan (gives DateTime)
* Static (Shared) methods:
Copy Code
Add(TimeSpan), AddTicks(Long),
AddDays/Hours/Milliseconds/Minutes (Double)
AddMonths/Years(Int32)
Equals
* Non-static (Instance) methods / properties:
Copy Code
Day, Month, Year, Hour, Minute, Second, Millisecond, DayOfWeek
CompareTo(DateTime)
TimeOfDay()
Equals
ToString()
Difference from .NET
SQL's datetime values are rounded to .000, .003 or .007 seconds, so it is
less precise than those of .NET.
The range of SQL's datetime starts at January 1st, 1753.
SQL does not have a built-in type for TimeSpan. It uses different
DATEDIFF methods that return 32-bit integers. One is DATEDIFF(DAY,...), which
gives the number of days; another is DATEDIFF(MILLISECOND,...), which gives
the number of milliseconds. An error results if the DateTimes are more than
24 days apart. In contrast, .NET uses 64-bit integers and measures TimeSpans
in ticks.
To get as close as possible to the .NET semantics in SQL, LINQ to SQL
translates TimeSpans into 64-bit integers and uses the two DATEDIFF methods
mentioned above to calculate the number of ticks between two dates.
DateTime UtcNow is evaluated on the client when the query is translated
(like any expression that does not involve database data).
Not implemented
Copy Code
IsDaylightSavingTime()
IsLeapYear(Int32)
DaysInMonth(Int32, Int32)
ToBinary()
ToFileTime()
ToFileTimeUtc()
ToLongDateString()
ToLongTimeString()
ToOADate()
ToShortDateString()
ToShortTimeString()
ToUniversalTime()
FromBinary(Long), FileTime, FileTimeUtc, OADate
GetDateTimeFormats(...)
constructor DateTime(Long)
Parse(String)
DayOfYear
如上所述,在System.DateTime 中, ToShortDateTime 都是未实现(作)的
可是这样的东西竟然可以编译过关,实在让人觉得 linq 太随便了
只能说 linq 带来了方便,但也带来了更多 runTime 时的危险
--
my blog:
http://kenshinnn.blogspot.com
operation system : Ubuntu GNU/linux
window manager : Gnome
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 125.232.0.251
※ 编辑: kenshinn 来自: 125.232.0.251 (07/07 23:06)