在编译的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
})
);
答案 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
的值。