2010-11-08 85 views
2

在编译的LINQ查询中作为条件部分,我使用了Datetime.Now。它曾经给我无关紧要的结果。我认为它用于为随后的几次调用存储相同的Datetime.Now值。为了解决这个问题,我将Datetime.Now作为一个值参数发送到编译后的查询中,并且工作正常。Datetime.Now缓存在.NET编译的LINQ查询中

旧代码

 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查询

在LINQ2SQL
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 
    }) 
); 
+0

你是什么意思的无关结果?你能发布整个查询吗?我想我们需要更多的信息。 – 2010-11-08 09:37:27

+1

这是一个数据库查询吗?它会使用数据库服务器的日期和时间吗?时钟是否同步? – Rup 2010-11-08 09:47:03

+0

@RUP,是的,数据库服务器的时间是正确的。 – 2010-11-08 09:56:05

回答

2

我看到了同样的问题。我使用SQL Profiler验证它已缓存了值DateTime.Now

+0

所以这是一个缓存问题。谢谢Eddie。:) – 2010-12-13 10:12:05

2

Datetime.Now在SQL查询转换GETDATE()。您的currentTime值在生成的SQL查询中的静态日期中翻译,如Where toto>'2010-10-10 03:00:00'。

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

+0

我验证了所有服务器的时间。它是一样的。 – 2010-11-09 08:38:56