2012-06-26 54 views
4

我一直在嘗試使用QueryOver完成此操作幾天而沒有太多進展。我似乎無法找到在一對多關係上爲左外連接添加條件的方法。我有問題和答案實體,問題有多個答案(這是一個調查,其中每個答案是對同一問題的另一個答案)。我試圖根據一些條件篩選所​​有的答案(例如,所有答案的分數爲< 3),但是,無論何時我嘗試添加條件語句,它都將添加到WHERE子句中,而不是JOIN中。向JOIN添加附加條件,而不是WHERE子句

例實體

問:

public class Question : Entity<int> 
{ 
    public virtual IEnumerable<Answer> Answers { get; set; } 
    ... 
} 

答:

public class Answer : Entity<int> 
{ 
    public virtual Question Question { get; set; } 
    public virtual int Score { get; set; } 
    ... 
} 

查詢

我試着用JoinQueryOver多種型號...

session.QueryOver<Question>() 
    .Where(q => q.Survey.Id == id) 
    .Left.JoinQueryOver(q => q.Answers) 
    .Where(a => a.Score < 3) 

...和JoinAlias並在那裏

session.QueryOver<Question>(() => questionAlias) 
    .Where(q => q.Survey.Id == id) 
    .Left.JoinAlias(() => questionAlias.Answers,() => answerAlias) 
    .Where(() => answerAlias.Score > 3); 

使用別名我總是得到這樣的查詢:

SELECT * FROM QUESTION q 
left outer join ANSWER a on q.Id=a.Question_id 
WHERE q.Survey_id = 1 and a.Score < 3 

,但我需要:

SELECT * FROM QUESTION q 
left outer join ANSWER a on q.Id=a.Question_id and a.Score < 3 
WHERE q.Survey_id = 1 

回答

9

原來我使用NHibernate的舊版本(3.1)是不支持這一點,但升級到3.3,現在有一個附加條款二可以傳遞,就像這樣:

Answer answerAlias = null; 
var questionQuery = session.QueryOver<Question>() 
    .Where(q => q.Survey.Id == id) 
    .Left.JoinQueryOver(q => q.Answers,() => answerAlias, a => a.Score > 3); 

我相信這是支持爲3.2(這個question接受的答案是什麼放倒我了)

+1

我希望我可以喜歡的答案。這幫了我很多,謝謝! – iamserious

+0

很高興我找到了這個答案,正是我一直在尋找的,非常感謝 –

+0

爲了這個世界上所有的人的愛!謝謝!我非常希望nhibernate文檔更好。 – mcfea

0

IIRC ,唯一支持此功能的查詢API是HQL:

from Question q 
left join q.Answers a with a.Score < 3 
where q.Survey.Id = :id 

(未經測試)

+0

嗯,我試圖篩選答案集合中的每個問題,但還是回到問題。有沒有其他的方法可以使用子查詢來做到這一點?換句話說,我不希望question.Answers延遲加載所有的答案,但它們的過濾器子集。 –

+0

您不能將不完整的集合作爲實體的一部分返回。改爲使用投影,或先加載問題,然後使用'session.Filter(question.Answers,「Score <3」)'來獲得過濾子集的答案。 –

相關問題