编译查询每次都返回相同的内容

时间:2010-02-23 23:13:19

标签: c# sql linq compiled-query

我有这个编译的查询:

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)
);

1 个答案:

答案 0 :(得分:2)

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

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

查看生成的SQL,你会看到我在说什么。