Запросы NHibernate по полям даты UTC - PullRequest
1 голос
/ 28 февраля 2012

Я пытаюсь выяснить, как написать запрос в NHibernate, чтобы возвращаемые результаты относились к определенной дате из определенного часового пояса пользователя.В настоящее время все даты в системе хранятся в формате UTC, и я сохраняю идентификатор часового пояса для текущего зарегистрированного пользователя.Мы смогли сделать запрос в sql, преобразовав дату UTC в дату часового пояса пользователей с помощью sql запросов.Теперь мы переходим к использованию NHibernate.Приведенный ниже код - это то, что я пытаюсь выполнить, но NHibernate создает исключение NotSupportedException для «System.DateTime Add (System.TimeSpan)», также не уверен, имеет ли это значение, но я собираюсь найти сервер базы данных MySQL.

    var readings = 
           session.Query<EnergyReading>()
          .Where(x => x.TimeStamp.Add(usersTimeZone.BaseUtcOffset).Date == usersTime.Date && x.DeviceId == deviceId);

РЕШЕНИЕ

Основываясь на предложении дегороллов, я пришел к следующему, которое сработало в моей ситуации.

        var usersTime = Utility.GetCurrrentUsersDateTime();
        var afterDate = TimeZoneInfo.ConvertTimeToUtc(usersTime.Date);
        var beforeDate = TimeZoneInfo.ConvertTimeToUtc(usersTime.Date.AddDays(1));

        var energyReadingsList = context.Session.Query<EnergyReading>()
            .Where(x => x.TimeStamp > afterDate && x.TimeStamp < beforeDate)
            .OrderByDescending(x => x.TimeStamp)
            .ToList();
        Utility.ConvertEnergyReadingDatesToUsersTimeZone(energyReadingsList);

1 Ответ

1 голос
/ 28 февраля 2012
var usersTimeUTC = usersTime.Date.Add(-usersTimeZone.BaseutcOffset);

var readings = 
           session.Query<EnergyReading>()
          .Where(x => x.TimeStamp == usersTimeUTC && x.DeviceId == deviceId);

UPDATE:

Чтобы настроить для соответствия полному дню часового пояса пользователей:

// You might want to do adjust lines below to do a more precise adjustment based 
// on the actual date to properly account for daylight savings.
var usersTimeUTCStart = usersTime.Date.Add(-usersTimeZone.BaseUtcOffset);
var usersTimeUTCEnd = usersTimeUTCStart.AddHours(24);

    var readings = 
               session.Query<EnergyReading>()
              .Where(x => x.TimeStamp >= usersTimeUTCStart && 
                   x.TimeStamp < usersTimeUTCEnd && 
                   x.DeviceId == deviceId);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...