2011-11-30 67 views
1

我试图做一个通用选择一个nhibernate对象。我传递函数求到get方法...通用NHibernate Linq的选择与func

T Get(Func<T, bool> selectQuery) 
{ 
    using (var session = SessionFactory.Session.OpenSession()) 
    { 
     return (from x in session.Query<T>() where selectQuery(x) select x).FirstOrDefault(); 
    } 
} 

但是这种方法执行的时候,我收到以下错误:

"Unable to cast object of type 'NHibernate.Hql.Ast.HqlParameter' to type 'NHibernate.Hql.Ast.HqlBooleanExpression'."

我试图使用表达式来代替,但得到同样的错误。我缺少一些有意思的东西,或者我正在尝试不可能的东西?

回答

2

我现在不能验证它,但我想问题是,不是传递表达式树,而是传递委托。试试这个:

T Get(Expression<Func<T, bool>> selectQuery) 
{ 
    using (var session = SessionFactory.Session.OpenSession()) 
    { 
     return (from x in session.Query<T>() where selectQuery(x) select x).FirstOrDefault(); 
    } 
} 

(我希望它没有错误编译,没有编译器在手)

+0

我发誓我以前曾经尝试过,但我必须有东西有点不同。你的例子没有编译,但有一点改变使它工作... return(from x in session.Query ()select x).Where(selectQuery).FirstOrDefault(); – dlswimmer

+0

我有一个问题,但如果这仍然做延迟执行的地方部分,直到FirstOrDefault发生。我将不得不检查日志以查看生成的内容。 – dlswimmer