2013-11-25 54 views
2

我用了太多的時間來尋找一種很好的方式來加載子集合。到目前爲止,這是我得到的。它的工作,但我覺得很難相信,這是寫這個查詢這是在NHibernate中加載子集合的正確方法

[Fact] 
    public void EagerLoadQueryOverWithFutureTest() 
    { 
     const long journalNr = 1470; 

     var query = _repo.QueryOver().Where(s => s.JournalNr == journalNr).Future<Sag>(); 
     var sagsansoegning = _repo.QueryOver().Where(an => an.JournalNr == journalNr).Fetch(x => x.Sagsansoegning).Eager.Future<Sag>(); 
     var noter = _repo.QueryOver().Where(n => n.JournalNr == journalNr).Fetch(x => x.Noter).Eager.Future<Sag>(); 
     var filer = _repo.QueryOver().Where(f => f.JournalNr == journalNr).Fetch(x => x.Filer).Eager.Future<Sag>(); 
     var emails = _repo.QueryOver().Where(e => e.JournalNr == journalNr).Fetch(x => x.Emails).Eager.Future<Sag>(); 
     var journal = _repo.QueryOver().Where(j => j.JournalNr == journalNr).Fetch(x => x.Journal).Eager.Future<Sag>(); 
     var sagsTilstand = _repo.QueryOver().Where(t => t.JournalNr == journalNr).Fetch(x => x.Tilstand).Eager.Future<Sag>(); 
     var boligsocialEvalueringer = _repo.QueryOver().Where(b => b.JournalNr == journalNr).Fetch(x => x.BoligsocialEvaluering).Eager.Future<Sag>(); 
     var result = query.SingleOrDefault(); 
     result.JournalNr.Should().Be(journalNr); 
     result.Emails.Should().HaveCount(c => c > 20); 
     result.Filer.Should().HaveCount(c => c > 20); 
    } 
+0

這些都是一對多關係嗎? – dotjoe

+0

其中有兩個是多對多的,其他的是一對多的 –

回答

1

我想追加不同的觀點的最好辦法,而不是答案如何使用「未來」僅做一個圓 - 去數據庫。

不知道爲什麼你需要獲取所有屬性。我想它可能是1)被你的代碼使用,例如來呈現UI或2)作爲以某種方式序列化並將其傳遞給客戶端的API。

在第一種情況下,我建議使用每個請求的會話並使用延遲加載。第二,我建議引入一個步驟:在將DTO傳遞給客戶之前構建DTO。這可以在會話仍處於打開狀態時完成,因此請使用延遲加載。

兩種情況下的延遲加載。所以,在這兩種情況下,我會建議使用不同的方法,然後明確提取。它將使用或多或少相同數量的選擇和往返數據庫。但最終它可能會更有效。因爲所有這些工作將留在NHibernate

事情是改變加載(手動)加載與批量大小(本機)。在這裏看到更多19.1.5. Using batch fetching。在這種情況下,NHibernate將處理您的查詢,然後再次用更少的查詢來加載剩餘的數據。但只有當真的需要

好處是,你不是你的疑問的囚犯。您可以使用實體上可用/應該可用的任何屬性,直到會話打開(即在視圖渲染或序列化期間)。您不必去追加另一個明確的查詢來加入以獲得渴望的數據。

因此,雖然未來可能是世界的解決方案,但是從APP到數據庫的連接速度非常緩慢......世界並不是使用NHibernate(ORM)。惰性映射和臨時加載的優點(具有批量功能)從維護角度來看是正確的方式...我會說

+0

感謝您的回答,我認爲像您一樣 - 回頭看看需要什麼總是一個好主意。我不需要立即加載所有這些屬性,這是一個測試。我會聽取您的建議並對批量大小進行微調,我認爲這是一種提高性能的簡單方法。 –

+0

Coool。還有,請考慮一下像Projections,Subqueries(過濾一對多)這樣的強大功能......並將其轉換爲一些DTO ... NHibernate功能非常強大,你知道得越多...越多得到;) –

相關問題