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
ありがとうございました。