項目中有了找回密碼功能,我很高興是由我做的,嘿嘿。
測試了很多遍沒有問題。結果還是無意中被別人發現了,“數據庫中的失效時間(ExpiredDate)與當前時間(DateTime.Now) 存在着 4 分多鍾 的差距”,我一直是取的DateTime.Now 當前時間比較的啊!
首先我們看看,下面的這行代碼,
var modelCode = LoadRepository.GetEntities<Entity.Verification_Code>().Where(i => i.Code.Equals(code) && i.ExpiredDate >= DateTime.Now).FirstOrDefault();
根據Sql Server Profiler查看SQL,有了驚人的發現:=》 [Extent1].[ExpiredDate] >= GetDate() :
也許你認為可能沒有什么問題,但是我看了看查詢分析器解析后的Sql,拿到的Sql中的DateTime.Now 卻變成了GetDate(),這什么情況;
exec sp_executesql N'SELECT TOP (1) [Extent1].[VerificationID] AS [VerificationID], [Extent1].[UserID] AS [UserID], [Extent1].[Code] AS [Code], [Extent1].[AddDate] AS [AddDate], [Extent1].[ExpiredDate] AS [ExpiredDate], [Extent1].[Status] AS [Status] FROM [dbo].[Verification_Code] AS [Extent1] WHERE ([Extent1].[Code] = @p__linq__0) AND ([Extent1].[ExpiredDate] >= (GetDate()))
',N'@p__linq__0 varchar(8000)',
@p__linq__0='f784222508ce4e859426fd0c8b95df8f'
於是我試了試 在 select getdate(); 發現真的 getdate() 與 當前時間存在着誤差
我可能明白了,DateTime.Now放在Where中不能進行比較。因為Linq只能與定值進行比較。所以先要轉成值。
修改如下:
var dateTime = DateTime.Now; var modelCode = LoadRepository.GetEntities<Entity.Verification_Code>().Where(i => i.Code.Equals(code) && i.ExpiredDate >= dateTime).FirstOrDefault();
根據Sql Server Profiler查看SQL,問題解決了,DateTime.Now回來了。@p__linq__1='2013-05-28 15:25:37.8470000'
exec sp_executesql N'SELECT TOP (1) [Extent1].[VerificationID] AS [VerificationID], [Extent1].[UserID] AS [UserID], [Extent1].[Code] AS [Code], [Extent1].[AddDate] AS [AddDate], [Extent1].[ExpiredDate] AS [ExpiredDate], [Extent1].[Status] AS [Status] FROM [dbo].[Verification_Code] AS [Extent1] WHERE ([Extent1].[Code] = @p__linq__0) AND ([Extent1].[ExpiredDate] >= @p__linq__1)',
N'@p__linq__0 varchar(8000),@p__linq__1 datetime',
@p__linq__0='f784222508ce4e859426fd0c8b95df8f',
@p__linq__1='2013-05-28 15:25:37.8470000'
總結:希望親們不要像我這樣菜,也可能這個錯誤只有我一個人犯,細節真的讓人覺得學習是很快樂的一件事!