Datetime.Now кэшируется в .NET-скомпилированном запросе LINQ. - PullRequest
2 голосов
/ 08 ноября 2010

Внутри скомпилированного запроса LINQ как части условия я использовал Datetime.Now. Раньше это дало мне неуместные результаты. Я думаю, что он имел обыкновение хранить то же значение Datetime.Now для нескольких последующих вызовов. Чтобы решить эту проблему, я отправляю Datetime.Now в качестве параметра значения для скомпилированного запроса, и он работает нормально.

Старый код

     event.EventEnd >= Datetime.Now

Новый код

     event.EventEnd >= currentTime

Где currentTime - переменная, содержащая значение Datetime.Now, полученное снаружи от скомпилированного запроса.

Пожалуйста, дайте мне знать, если это поведение по умолчанию для выполненного запроса LINQ, или я где-то ошибался

Платформа: ASP.NET 4.0, MVC 2.0

Нерелевантные результаты означают, скажем, что у нас есть одна запись со значением eVent.EventEnd 10-10-10 14:10, если я выполню запрос в 10-10-10 14:00, мы получим эту запись в результат. Если я выполню запрос в 10-10-10 15:00, мы получим эту запись в результате. Что не так. Но после того, как я использую переменную вместо DateTime.Now, она работает нормально.

Скомпилированный запрос LINQ

public static Func<DataContext, CommonParams, string, DateTime, IQueryable<EventEntity>> GetEventsByOwnerID 
= CompiledQuery.Compile(
(DataContext context, CommonParams inputParams, string eventType, DateTime currentTime ) =>
   (from eVent in context.Events
    join categories in context.Categories on eVent.CategoryID equals categories.CategoryID
    where  !eVent.IsDeleted 
    && eVent.OwnerID == inputParams.UserID
    && (eventType == "ALL" ||
        (eventType == "CURRENT" && eVent.EventEnd >= currentTime) ||
        (eventType == "OLD" && eVent.EventEnd < currentTime))
    orderby eVent.PostedOn descending
    select new EventEntity()
    {
        EventID = eVent.EventID,
        CategoryID = eVent.CategoryID,
        Title = eVent.Title,
        Owner = eVent.OwnerName,
        EventStart = eVent.EventStart,
        EventEnd = eVent.EventEnd,
        Host = eVent.Host,
        Location = eVent.Location,
        Description = eVent.Description,
        Email = eVent.Email,
        URL = eVent.URL,
        Phone = eVent.Phone,
        CategoryName = categories.CategoryName,
        ProgramName = eVent.ProgramName,
        IsTelevised = eVent.IsTelevised,
        ChannelName = eVent.ChannelName,
        CityID = eVent.CityID,
        CountryID = eVent.CountryID,
        IsActive = eVent.IsActive,
        OwnerID = eVent.OwnerID,
        IsEndTimePartEmpty = eVent.IsEndTimePartEmpty,
        IsStartTimePartEmpty = eVent.IsStartTimePartEmpty,
        IsDeleted = eVent.IsDeleted,
        ThumbnailURL = eVent.ThumbnailURL,
        AttendeeCount = eVent.AttendeeCount,
        CommentsCount = eVent.CommentsCount
    })
);

Ответы [ 2 ]

2 голосов
/ 30 ноября 2010

Я видел ту же проблему.Я проверил с помощью SQL Profiler, что он кэшировал значение DateTime.Now.

2 голосов
/ 08 ноября 2010

Datetime. Теперь в вашем Linq2Sql переводится в GetDate () в вашем запросе sql.Ваше значение currentTime преобразуется в статическую дату в сгенерированном sql-запросе, например, «Где»> «2010-10-10 03:00:00».

Таким образом, кажется, что региональные настройки или часы не синхронизируются междуВаше программное обеспечение и сервер БД.Может быть, GMT-1 или GMT + 1 где-то.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...