2009-06-10 50 views
0

這是我第一次將NHibernate用於大型項目,所以請耐心等待。基本上,我需要運行基於5個字段的搜索。迭代NHibernate加入

我想在表格中顯示結果。這是我寫的一個測試,基本上讓所有擁有名爲「DII」的人員進入的客戶端。當我運行它時,我收到一個錯誤消息,說明一些Intakes是空的。

var name = new Name("Alice", "B." "Cooper"); 
var staff = "DII"; 
var fileNumber = 12345; 

var crit = NHibernateHelper.GetCurrentSession().CreateCriteria(typeof(Client)); 
var result = crit.CreateAlias("Intakes", "i");    
     .Add(Restrictions.Like("Name.First", name.First + "%")); 
     .Add(Restrictions.Like("Name.Middle", name.Middle + "%")); 
     .Add(Restrictions.Like("Name.Last", name.Last + "%")); 
     .Add(Restrictions.Eq("i.Staff", staff));    
     .Add(Restrictions.Eq("i.FileNumber", fileNumber)); 
     .List<Client>(); 

foreach (var client in result) 
{ 
    Assert.IsTrue(client.Intakes.All(i => i.Staff == "DII"); 
} 

但是,它確實返回正確數量的客戶端。我的問題是,如何迭代通過上述ICriteria生成的查詢返回的相關Intakes?

我試圖修改的最後一行是:

Assert.IsTrue(c.Intakes.Where(i => i != null).All(i => i.Staff == "DII")); 

而且它工作正常,但生成的SQL是:

SELECT (Client + Intake Join) ... 
SELECT FROM IntakeTable ... 
SELECT FROM IntakeTable ... 
SELECT FROM IntakeTable ... 
(for each Intake that was returned with the join) 

這意味着它運行的加入,然後獲取所有再次進食,這不是我想要的。

回答

0

Doh,想通了。這是因爲我的地圖。我正在使用:

<list ... /> 

...並按非位置列排序。正因爲如此,我在Intakes關聯中得到了一堆空條目。

我把它變成了一個有序的包,一切都如你所願。