で正しくキャッシュされている、NHibernateのは、クエリが同じであるとき、変数の値を更新クエリプランをキャッシュしません。期待LINQの投影は、以下のような単純な投影を考えるとNHibernateは3.2
int argValue = 1;
var result1 = database.Users.Select(x => new {x.Name, BadArg = argValue}).First();
argValue = 2;
var result2 = database.Users.Select(x => new {x.Name, BadArg = argValue}).First();
結果1値の名前= "ボブ" であろうとBadArg = 1つの
結果2値NAME = "ボブ" とBadArg = 2
あろう実際
結果1値は、Name = "ボブ" とBadArg = 1つの
結果2値は、明らかにこれは多くを引き起こす可能性があります名前= "ボブ" とBadArg = 1
だろうだろうあなたがそれを期待していないならば、狂った行動の。私はNHibernateはのバグ追跡にこれに類似couple bug reportsを見てきましたが、昨年5月以来、その上に任意のアクションがなかったです。誰もLinqを使ってNhibernateを大いに使っていないか、私が知らないいくつかの回避策があります。
私はNHibernateはソースに掘る前に、この動作を防止するためのクエリプランのキャッシュまたは他のいくつかの回避策を無効にする方法があるか、誰が、上記のリンクからパッチを適用していますか?
注
例は実際に、私は途中で動作しませんIEnumerableをへの変換、私はIQueryableをとして維持したい複雑な突起部を持って、簡単な質問を保つためのものです。
更新 は、あなたが完全にキャッシュを回避したい場合は、このようにコードを変更してみてくださいNHibernateは3.2.1
私は好奇心から、このに見てきた、それは問題が適切にNHibernateのキャッシュではありませんように、それはLINQの式ツリーキャッシュだ見えます。問題は、式ツリーが単純化され、変数参照が定数式に還元された後にキャッシュキーが構築されることです。しかし、その時点ではスコープ変数refと定数の間に違いがないことがあります。 : -/ – Rytmis
私もこの問題を抱えてきました。数ヶ月ごとにそれが作物をバックアップし、私はそれを忘れてしまって、それを再発見するだけです。私の場合は、匿名のオブジェクトに投影するのではなく、自分自身のオブジェクトを評価することになります。 –