2011-11-30 72 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