2012-03-02 48 views
3

我對NHibernate和QueryOver相當陌生,我無法讓NHibernate生成我需要的SQL。QueryOver - 爲Join添加附加條件

我需要做一個連接,並有一個額外的標準,所以我避免從我加入的表中獲取大量數據。

我從QueryOver接收的SQL是:

SELECT * FROM adresse this_ 
left outer join r580_test.afvigelse remarkalia1_ on this_.id=remarkalia1_.adrid 
left outer join r580_test.afvigelseklagepunkter remarkcomp5_ on remarkalia1_.id=remarkcomp5_.afvigelseid 
left outer join r580_test.klagepunkter complainta2_ on remarkcomp5_.klagepunktid=complainta2_.id 
WHERE this_.id = 16633 and remarkalia1_.dato between '2009-03-13 00:00:00' and '02-03-2012 16:34:35' 

我想這是什麼(間已被轉移到年底第一左外,其中日加入):

SELECT * FROM adresse this_ 
left outer join r580_test.afvigelse remarkalia1_ on this_.id=remarkalia1_.adrid and remarkalia1_.dato between '2009-03-13 00:00:00' and '02-03-2012 16:34:35' 
left outer join r580_test.afvigelseklagepunkter remarkcomp5_ on remarkalia1_.id=remarkcomp5_.afvigelseid 
left outer join r580_test.klagepunkter complainta2_ on remarkcomp5_.klagepunktid=complainta2_.id 
WHERE this_.id = 16633 

我QueryOver看起來是這樣的:

adr = session.QueryOver<Address>() 
    .Where(x => x.Id == 16633) 
    .JoinQueryOver<Remark>(y => y.Remarks).Where(y => y.Created > DateTime.Now.AddDays(-14)) 
    .JoinAlias(y => y.RemarkComplaint,() => complaintAlias, JoinType.LeftOuterJoin) 
    .SingleOrDefault(); 

任何人有關於如何解決這個問題的想法?

回答

1

有用於joinqueryover幾個重載 - 我相信你想要的東西,如:

Remark remark = null; 
adr = session.QueryOver<Address>() 
    .Where(x => x.Id == 16633) 
    .JoinQueryOver<Remark>(y => y.Remarks,() => remark, y => y.Created > DateTime.Now.AddDays(-14)) 
    .JoinAlias(y => y.RemarkComplaint,() => complaintAlias, JoinType.LeftOuterJoin) 
    .SingleOrDefault(); 

在這種情況下,第三個參數是條款二,我相信它,將限制添加到加入。

+0

我似乎無法使其工作。我無法找到JoinQueryOver的重載,它讓我可以完成你所描述的任務。我只能給路徑,別名和JoinType。你使用的是什麼版本的NHibernate? – Ramius 2012-03-05 15:04:24

+0

我正在使用NHibernate 3.2。 – Fourth 2012-03-05 15:47:51

+0

這似乎不是3.3的一部分,最接近的匹配需要'ICriterion withClause',這意味着回到魔術字符串。 – Shagglez 2013-02-12 17:32:35