Я использую два запроса LINQ для доступа к моей базе данных с использованием Entity Framework:
Первый хранит токен в базе данных и дает ему 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-entity. Linq-to-objects отлично работает!