2010-11-08 9 views
2

A l'intérieur d'une requête LINQ compilée en tant que partie de condition, j'utilisais Datetime.Now. J'avais l'habitude de me donner des résultats non pertinents. Je pense qu'il a utilisé pour stocker la même valeur Datetime.Now pour quelques appels ultérieurs. Pour résoudre ce problème, j'envoie Datetime.Now en tant que paramètre de valeur à la requête compilée et cela fonctionne correctement.Datetime.Now mis en cache dans une requête LINQ compilée .NET

Ancien code

 event.EventEnd >= Datetime.Now 

Nouveau Code

 event.EventEnd >= currentTime 

Où currentTime est une variable contient une valeur Datetime.Now reçue en dehors de la requête compilée.

S'il vous plaît laissez-moi savoir si cela est le comportement par défaut de requête LINQ satisfait ou je me suis trompé quelque part

Plate-forme: ASP.NET 4.0, MVC 2.0

moyen de résultats non pertinents, disons que nous avons un enregistrement avec La valeur eVent.EventEnd est 10-10-10 02:10 PM, si je cours la requête à 10-10-10 02:00 PM, nous obtenons cet enregistrement dans le résultat. Si je cours la requête à 10-10-10 03:00 PM aussi nous obtenons cet enregistrement dans le résultat. Ce qui est faux. Mais après avoir utilisé la variable à la place sur DateTime.Now, cela fonctionne très bien.

Compilé requête 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

Qu'entendez-vous par résultats non pertinents? Pouvez-vous publier l'intégralité de la requête? Je pense que nous avons besoin de plus d'informations ici. –

+1

S'agit-il d'une requête de base de données? Aurait-il utilisé la date et l'heure du serveur de base de données? Les horloges sont-elles synchronisées? – Rup

+0

@RUP, Oui, l'heure du serveur DB est correcte. –

Répondre

2

J'ai vu le même problème. J'ai vérifié en utilisant SQL Profiler qu'il avait mis en cache la valeur de DateTime.Now.

+0

Il s'agit donc d'un problème de cache. Merci Eddie. :) –

2

Datetime.Now dans votre Linq2Sql est traduit en GetDate() dans votre requête SQL. Votre valeur currentTime est traduite dans une date statique dans votre requête sql générée comme Où toto> '2010-10-10 03:00:00'.

Il semble donc que les paramètres régionaux ou les horloges ne sont pas synchronisés entre votre logiciel et le serveur de base de données. Peut-être un GMT-1 ou GMT + 1 quelque part.

+0

J'ai vérifié l'heure de tous les serveurs. Et c'est pareil. –

Questions connexes