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 之后,它仍然返回相同的对象——我期待 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)
);
4

1 回答 1

2

当您在已编译查询中传入 DateTime.UtcNow 时,您将设置一个常量日期作为 SQL 的一部分。但是当您传入一个参数时,您正在创建一个参数化查询,其中参数(即日期)可以在您每次调用它时更改。

当您回收应用程序池时,您将重新编译查询。

查看生成的 SQL,您会明白我在说什么。

于 2010-02-23T23:16:08.840 回答