我有这个编译的查询:
private static Func<DBContext, Foo> FooQuery = CompiledQuery.Compile<DBContext, Foo>(
_db => _db.FooTable.SingleOrDefault(f => f.DeletionDate == null || f.DeletionDate > DateTime.UtcNow)
);
当我运行一次时,它会返回预期的Foo对象。
但是,即使在db中设置了该对象的DeletionDate之后,它仍然返回相同的对象 - 我期待null。 (在回收应用程序池后,它会按预期返回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)
);
答案 0 :(得分:2)
在编译的查询中传入DateTime.UtcNow时,您将一个常量日期设置为SQL的一部分。但是当您传入参数时,您正在创建一个参数化查询,其中每次调用参数(即日期)都可以更改。
当您回收应用程序池时,您将重新编译该查询。
查看生成的SQL,你会看到我在说什么。