2010-02-23 3 views
3

cette requête compilé:requête Compilé retourne la même chose à chaque fois que je

private static Func<DBContext, Foo> FooQuery = CompiledQuery.Compile<DBContext, Foo>(
    _db => _db.FooTable.SingleOrDefault(f => f.DeletionDate == null || f.DeletionDate > DateTime.UtcNow) 
); 

Quand je lance une fois, il retourne l'objet Foo attendu. Mais alors, même après que DeletionDate de cet objet est défini dans la base de données, il renvoie toujours le même objet - j'attends null. (Il renvoie null, comme prévu, après avoir recyclé le pool d'applications.)

Pour une raison quelconque, cela fonctionne lorsque j'utilise la requête compilée suivante à la place (et transmettez DateTime.UtcNow), mais je ne sais pas pourquoi.

private static Func<DBContext, DateTime, Foo> FooQuery = CompiledQuery.Compile<DBContext, DateTime, Foo>(
    (_db, now) => _db.FooTable.SingleOrDefault(f => f.DeletionDate == null || f.DeletionDate > now) 
); 

Répondre

2

Lorsque vous passez DateTime.UtcNow dans la requête compilée, vous définissez une date constante dans le cadre du SQL. Mais lorsque vous transmettez un paramètre, vous créez une requête paramétrée dans laquelle le paramètre (c'est-à-dire la date) peut changer chaque fois que vous l'appelez.

Lorsque vous recyclez le pool d'applications, vous recompilez la requête à nouveau.

Vérifiez le SQL généré et vous verrez de quoi je parle.

+0

Merci. Dommage que DateTime.UtcNow n'est pas remplacé par GETUTCDATE() dans le SQL. – Emmett

Questions connexes