C# 将编译后的表达式传递给Linq到NHibernate

C# 将编译后的表达式传递给Linq到NHibernate,c#,linq,nhibernate,expression-trees,C#,Linq,Nhibernate,Expression Trees,我有一个已编译表达式的集合,我将其组合成一个表达式,因为我希望动态构建我的linq查询。请参阅,了解我使用编译表达式以防止堆栈溢出的原因,因为在我的计算机中,当查询包含7000多个表达式时,它会引发此异常。) 然后我使用新生成的表达式并将其传递给FindAll方法。问题,NHibernate无法执行查询,并表示: 无法将类型为“nhibernate.hql.ast.parameter”的对象强制转换为类型为“nhibernate.hql.ast.hqlbooleanpression” publi

我有一个已编译表达式的集合,我将其组合成一个表达式,因为我希望动态构建我的linq查询。请参阅,了解我使用编译表达式以防止堆栈溢出的原因,因为在我的计算机中,当查询包含7000多个表达式时,它会引发此异常。) 然后我使用新生成的表达式并将其传递给FindAll方法。问题,NHibernate无法执行查询,并表示:

无法将类型为“nhibernate.hql.ast.parameter”的对象强制转换为类型为“nhibernate.hql.ast.hqlbooleanpression”

public IList<T> FindAll(Expression<Func<T, bool>> criteria)
{
     return SessionFactory.GetCurrentSession()
                          .QueryOver<T>()
                          .Where(criteria)
                          .List();
}
作为参考,如果没有编译,它看起来会像这样:

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

谢谢。

编译后的表达式基本上是动态程序集中的MSIL代码。NHiberate不知道如何从编译后的代码中提取头尾信息,因此它需要表达式来遍历表达式树。我会尝试解决拥有7000个表达式的问题,而不是尝试使用编译表达式。你是对的,我应该努力减少表达式的数量。谢谢你的回答。@vcsjones也许你想把它作为一个答案发布?@JohnSmith也许有办法让NHibernate处理你的7000个表达式(虽然我不确定具体如何),但我认为生成的SQL会非常慢。看看你前面的问题,你也许可以将表达式合并为一组
int[]{1,2,3,4,5,6,7}.Any(i=>i==[someEntity].UserId)
,它们将转换为
中的
exists
语句。
([someEntity].UserID == 1) // this works