4

我想設置適當的域架構使用流利NHibernate和Linq到NHibernate。我有我的控制器調用我的存儲庫類,這些類做NHibernate thang下,並傳回ICollections的數據。這似乎工作得很好,因爲它抽象了數據訪問並保持了NHibernate的「精細打印」功能。NHibernate查詢邏輯放在哪裏?

但是,現在我發現我的控制器需要在不同的上下文中使用相同的數據調用。例如,我的repo返回一個用戶列表。當我想顯示用戶列表時,這很好,但是當我想開始使用子類來顯示角色等時,我遇到了SELECT N + 1問題。我知道如何在NHibernate中改變它,所以它使用連接,但我的具體問題是我在哪裏放這個邏輯?我不希望每個GetAllUsers()調用都返回角色,但我確實希望其中的一些。

因此,這裏有我的三個選項,我看到:

  1. 變化在我的映射設置這樣的角色加入到我的查詢。
  2. 創建兩個Repository調用 - GetAllUsers()和GetUsersAndRoles()。
  3. 將我的IQueryable對象從Repository返回到Controller,並使用NHibernate Expand方法。

對不起,如果我沒有解釋得很好。我只是跳進DDD,很多這個術語對我來說還是新的。謝謝!

回答

2

正如lomaxx指出的那樣,您需要query.Expand。

爲了防止您的存儲庫因各種可能的情況而變得模糊不清,您可以創建查詢對象來進行可配置的查詢。

我發佈了一些使用ICriteria API on my blog的例子。 ICriteria API有FetchMode而不是Expand,但這個想法是一樣的。

+0

我喜歡這個答案,謝謝!現在我需要將其轉換爲Linq ... – 2010-05-11 14:14:32

1

我嘗試並保留所有查詢邏輯在我的存儲庫中,並嘗試僅從它們傳回ICollection。

在你的情況下,我會傳入一些參數來確定你是否想要加載角色,並用這種方式構造IQueryable。例如:

GetAllUsers(bool loadRoles) 
{ 
    var query = session.Linq<Users>(); 
    if(loadRoles) 
     query.Expand("Roles"); 
    return query.ToList(); 
} 
+0

我喜歡這個答案,但我真的可以看到它在一個複雜的情況下變得瘋狂。我的場景非常簡單 - 我的真實情況有很多子對象。 – 2010-05-11 14:15:33

0

我會選擇2,創建兩個存儲庫。也許我會考慮創建另一個庫調用GetRoleByUser(用戶用戶)。因此,如果需要,可以在單獨線程上更改用戶選擇時訪問用戶角色,以便增加性能,並且不會爲每個用戶加載每個用戶的角色,這將需要大部分資源。

0

聽起來好像你在問是否有可能讓GetAllUsers()有時只返回用戶實體,有時返回用戶和角色。

我要麼創建一個單獨的存儲庫方法GetRolesForUser(User user),使用懶惰加載角色,或使用lomaxx的答案提到的GetAllUsers(bool loadRoles)

我會傾向於延遲加載角色或存儲庫中的單獨方法。