我用兩個LINQ查詢訪問使用實體框架我的數據庫:針對實體框架的LINQ查詢如何將日期傳遞給SQL Server?
第一存儲令牌在數據庫中,並賦予它60秒超時:
string tokenHash = GetTokenHash();
Token token = new Token()
{
Client = client,
Expiry = DateTime.Now.AddSeconds(60),
UserId = userId,
TokenHash = tokenHash,
};
context.AddToToken(token);
context.SaveChanges();
第二檢查匹配令牌尚未到期:
var item = (from t in datasource.SmsToken
where t.Client.Id == clientId
&& t.UserId == userId
&& t.TokenHash == tokenHash
&& t.Expiry > DateTime.Now
select t);
bool success = item.Count() >= 1;
我遇到的問題是,這是在測試服務器上完美的工作。現在,它已移到不同的環境,它不再有效。
我已經傾倒了大量的調試信息,一切似乎都匹配。如果我刪除t.Expiry > DateTime.Now
條件,它工作正常。所以問題在於日期比較。
新服務器已在Windows中使用不同的日期格式和全球化設置進行設置。我認爲這是問題,這讓我困惑。
我原以爲會使用LINQ和EF存儲和檢索日期。我應該沒有任何格式問題?誰能告訴我這裏有什麼問題?
更新:
有趣的是,我用替換檢索代碼得到正確的行爲如下:
var item = (from t in datasource.SmsToken
where t.Client.Id == clientId
&& t.UserId == userId
// && t.TokenHash == tokenHash
// && t.Expiry > DateTime.Now
select t).ToList();
var matchingToken = (from t in item
where t.TokenHash == tokenHash
&& t.Expiry > DateTime.Now
select t).FirstOrDefault();
bool success = matchingToken != null;
這表明,我認爲這個問題是與日期比較做在Linq-to-entities之內。 Linq到對象工作正常!
您可以針對兩臺服務器運行跟蹤並查看實際執行的是什麼sql? – kristian 2010-02-24 05:49:23
我可以,是的...好主意。 – Damovisa 2010-02-24 05:54:43
明天我必須跟進這個。感謝您的建議。 – Damovisa 2010-02-24 07:25:47