Внутри скомпилированного запроса 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
})
);