Datetime.Now缓存在.NET编译的LINQ查询中

时间:2010-11-08 09:33:56

标签: linq-to-sql asp.net-mvc-2

在编译的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 02:10 PM,如果我在10-10-10 02:00 PM运行查询,我们会在结果。如果我在10-10-10 03:00 PM运行查询,我们也会在结果中获得该记录。哪个错了。但是在我使用变量而不是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 个答案:

答案 0 :(得分:2)

您的Linq2Sql中的Datetime.Now在您的sql查询中被转换为GetDate()。您的currentTime值在生成的SQL查询中以静态日期进行转换,例如Where toto&gt; '2010-10-10 03:00:00'。

因此,您的软件和数据库服务器之间似乎没有同步区域设置或时钟。也许是某地的GMT-1或GMT + 1。

答案 1 :(得分:2)

我看到了同样的问题。我使用SQL事件探查器验证了它已缓存DateTime.Now的值。