2011-09-14 35 views
2

我試圖用一個簡單的限制來限制一個左外連接,但是它失敗了一個sql異常。爲什麼ICriteria沒有將變量值傳遞給withClause?

System.Data.SqlClient.SqlException:必須聲明標量變量「@ p1」。

我的ICriteria:

var r = session.CreateCriteria<Parent>("p") 
.CreateCriteria("p.Children", "c", NHibernate.SqlCommand.JoinType.LeftOuterJoin, Restrictions.Eq("c.Name", "John Doe")) 
.List(); 

所需的SQL:

SELECT * FROM Parents p 
LEFT OUTER JOIN Children c ON c.ParentID = p.ID AND c.Name = 'John Doe' 

我一定要以任何方式添加變量值?由NHibernate生成的SQL是正確的,但變量只是不發送到服務器。

+0

我得到這個太:必須聲明變量「@ P19」 –

回答

2

我認爲你可能在NHibernate ICriteria中發現了一個錯誤,你在一個集合上加入LeftOuterJoin,但實體有兩個或多個集合。在這種情況下,它將使用兩個參數在兩個集合上生成'和'連接,但只提供一個。和數據庫會拋出:

Insufficient parameters supplied to the command 

這可能是一個好主意,open a bug。與此同時,這是支持與HQL:

var query = session.CreateQuery(
    "select p from Parent p left outer join p.Children as c with c.Name = :name"); 

query.SetString("name", "John Doe"); 
var parents = query.List<Parent>(); 
+0

是的,但我需要使用一個左連接檢索所有的父母,即使他們有沒有孩子? –

+0

是的,但它增加了對WHERE子句的限制,我需要它在連接本身的ON子句中。否則,我必須創建一個析取行來保留連接不匹配的行。 –

+0

查看最後更新。 – Dmitry