2

linq クエリを動的に作成したいので、1 つの式に結合したコンパイル済みの式のコレクションがあります。 クエリに 7000 を超える式が含まれていると、この例外がスローされるため、スタックオーバーフローを防ぐためにコンパイル済みの式を使用した理由については、ExpressionTree Compile() メソッドがスタックオーバーフロー例外を生成するを参照してください。) 次に、新しく生成された式を使用し、それを FindAll メソッドに渡します。問題、NHibernate はクエリを実行できず、次のように言います。

タイプ「nhibernate.hql.ast.parameter」のオブジェクトをタイプ「nhibernate.hql.ast.hqlbooleanexpression」にキャストできません

public IList<T> FindAll(Expression<Func<T, bool>> criteria)
{
     return SessionFactory.GetCurrentSession()
                          .QueryOver<T>()
                          .Where(criteria)
                          .List();
}

デバッグしたところ、nhibernate がファイル HqlTreeNode (メソッド: HqlTreeNodeExtensions.AsBooleanExpression(this HqlTreeNode ノード)) でコンパイルされた式をブール式に変換しようとしていることがわかりましたが、これはもちろん機能しません。

条件変数は次のようになります。

(Invoke(value(System.Func`2[Something.SomeEntity,System.Boolean]) // this don't work

参考までに、コンパイルされていない場合は、次のようになります。

([someEntity].UserID == 1) // this works

ありがとうございました。

4

0 に答える 0