2010-02-23 7 views
3

У меня есть этот скомпилированный запрос:Составитель запрос возвращает одно и то же каждый раз, когда

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

Когда я запускаю его один раз, он возвращает ожидаемый объект Foo.

Но тогда, даже после того, как DeletionDate этого объекта установлен в db, он все равно возвращает тот же объект - я ожидаю null. (Он возвращает нуль, как и ожидалось, после утилизации пула приложений.)

По какой-то причине он работает, когда вместо этого используется следующий скомпилированный запрос (и передается в DateTime.UtcNow), но я не уверен, почему.

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

ответ

2

Когда вы передаете в DateTime.UtcNow в составленном запросе, вы настраиваете постоянную дату как часть SQL. Но когда вы передаете параметр, вы создаете параметризованный запрос, в котором параметр (т. Е. Дата) может меняться каждый раз, когда вы его вызываете.

Когда вы перерабатываете пул приложений, вы снова перекомпилируете запрос.

Проверьте сгенерированный SQL, и вы увидите, о чем я говорю.

+0

Спасибо. Слишком плохо DateTime.UtcNow не заменяется GETUTCDATE() в SQL. – Emmett

Смежные вопросы