Linq to sql 现在缓存在.NET编译的LINQ查询中
在编译后的LINQ查询中作为条件部分,我使用了Datetime.Now。它过去常常给我不相关的结果。我认为它过去存储相同的Datetime。现在,它的值对于以后的几个调用都是一样的。为了解决这个问题,我将Datetime.Now作为一个值参数发送到已编译的查询,它工作正常 旧代码Linq to sql 现在缓存在.NET编译的LINQ查询中,linq-to-sql,asp.net-mvc-2,Linq To Sql,Asp.net Mvc 2,在编译后的LINQ查询中作为条件部分,我使用了Datetime.Now。它过去常常给我不相关的结果。我认为它过去存储相同的Datetime。现在,它的值对于以后的几个调用都是一样的。为了解决这个问题,我将Datetime.Now作为一个值参数发送到已编译的查询,它工作正常 旧代码 event.EventEnd >= Datetime.Now event.EventEnd >= currentTime 新代码 event.EventEnd >=
event.EventEnd >= Datetime.Now
event.EventEnd >= currentTime
新代码
event.EventEnd >= Datetime.Now
event.EventEnd >= currentTime
其中currentTime是一个变量,包含Datetime.Now值,该值从编译查询外部接收
请告诉我这是LINQ查询的默认行为还是我在某个地方错了
平台:ASP.NET4.0、MVC2.0
无关结果意味着,假设我们有一条记录带有eVent.EventEnd值是10-10-10 02:10 PM,如果我在10-10-10 02:00 PM运行查询,我们将在结果中得到该记录。如果我在晚上10-10-10 03:00运行查询,我们也会在结果中得到该记录。这是错误的。但是当我在DateTime上使用变量后,现在,它工作得很好
编译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
})
);
公共静态函数GetEventsByOwnerID
=CompiledQuery.Compile(
(DataContext上下文,CommonParams inputParams,string eventType,DateTime currentTime)=>
(来自上下文中的事件。事件
在上下文中连接类别。eVent.CategoryID上的类别等于categories.CategoryID
哪里!eVent.IsDeleted
&&eVent.OwnerID==inputParams.UserID
&&(eventType==“全部”||
(eventType==“当前”&&eVent.EventEnd>=当前时间)||
(eventType==“旧”和&eVent.EventEnd
Datetime.Now在您的Linq2Sql中被转换为sql查询中的GetDate()。您的currentTime值在生成的sql查询中转换为静态日期,如Where toto>'2010-10-10 03:00:00'
因此,您的软件和DB服务器之间似乎没有同步区域设置或时钟。可能是某个地方的GMT-1或GMT+1。我也看到了同样的问题。我使用SQL Profiler验证了它是否缓存了
DateTime的值。现在
不相关的结果是什么意思?你能发布整个查询吗?我想我们需要更多的信息。这是数据库查询吗?它会使用数据库服务器的日期和时间吗?时钟是否同步?@RUP,是的,DB服务器时间正确。我验证了所有服务器的时间。这是一样的,所以这是一个缓存问题。谢谢你,埃迪