2012-04-20 39 views
2

如果您執行nHiberante Linq查詢並且想要加載相關對象。 你在哪裏把FetchFetchMany在nHibernate Linq語句中放置Fetch或FetchMany的最佳順序

像這樣:

_session.Query<Entity>() 
    .Where(x => x.IsSomething) 
    .FetchMany(x => x.Children); 

或者這樣:

_session.Query<Entity>() 
    .FetchMany(x => x.Children) 
    .Where(x => x.IsSomething); 

我想知道的最佳順序放置FetchFetchMany(對於性能)。或者訂單甚至重要嗎?當我使用實體框架時,我總是先寫入包含,這與nHibernate中的情況是否一樣?

我們在nHibernate中使用規範模式。那麼將FetchFetchMany置於規格中是否明智?

+1

只是監控生成的SQL。至於說明書:不。規範意味着DAL實現的抽象。您只需指定標準並讓DAL決定如何找出它們。在DAL內部,您可能會根據指定的標準來「取」。 – 2012-04-24 06:53:25

回答

3

沒關係。 IQueryable只是一個查詢語句和Fetch(),FetchMany()只是Nhibernate查詢中的一個設置,它放大查詢以返回更多數據,以便稍後不執行延遲加載。在調用ToList(),Single()等之前,查詢不會發送到數據庫。然後將linq查詢轉換爲包含更多連接和列的sql查詢,然後將其發送到數據庫服務器。

下面的查詢會做取實體+兒童在一個「類似」的加入,但在這裏我把它映射到一個匿名對象:

_session 
    .Query<Entity>() 
    .Where(x => x.IsSomething) 
    .Select(x => new { MyEntity = x, MyEntitiesChildren = x.Children });