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 を期待しています。(アプリ プールをリサイクルした後、予想どおり 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 に答える