2011-08-15 49 views
1

因此,我將調用一個存儲庫,以使用FluentNHibernate檢索複雜對象圖的根對象。但是對於某些子級別的對象,我不想檢索所有元素,但只有那些日期參數等於特定條件的元素。在下面的代碼中,我希望通過OrderTime字段以這種方式過濾較低級別的Order對象。FluentNhibernate,檢索部分對象圖

含義我想檢索所有用戶組和所有用戶,但每個用戶的訂單對象只能包含特定日期或日期範圍內的訂單。

那麼我有什麼選擇如何檢索這個對象圖?我不想延遲加載,我只想指定一些不同的檢索條件,這將永遠不會改變。因此,它們可以是存儲庫的單獨功能,就像最後提出的一樣。 但是,我將如何去編碼這些方法,如何指定這些條件?

對象:

public class UserGroup 
{ 
    public int Id; 
    public IList<User> Users; 
} 

public class User 
{ 
    public int Id; 
    public string Name; 
    public IList<Order> Orders; 
} 

public class Order 
{ 
    public int Id; 
    public decimal Price; 
    public System.DateTime OrderTime; 
} 

庫:

public class UserGroupRepository 
{  
    public List<UserGroup> GetAll() 
    { 
     using (ISession session = FNH_Manager.OpenSession()) { 
      dynamic obj = session.CreateCriteria(typeof(UserGroup)).List<UserGroup>(); 
      return obj; 
     } 
    } 
} 

潛在的新方法庫?

public List<UserGroup> GetAll_FilterOrderDate(System.DateTime _date) 
{ 
} 

public List<UserGroup> GetAll_FilterOrderDate(List<System.DateTime> _dates) 
{ 
} 

回答

0

這實際上取決於您想要對訂單做什麼。

是否有你需要查詢聚合根的原因?按日期查詢實際訂單是否有意義?所以你最終得到:

session.QueryOver<Order>().Where(t => t.OrderDate > ...); 

如果你的關聯設置正確,你仍然可以導航到用戶。

我個人認爲庫模式是有點嚴格,寧可使用查詢對象,所以你最終的東西,如:

queryService.FindAll<UserGroup>(new GetAllByFilterOrderDate(DateTime.Now)); 

但是,如果一個倉庫的概念,爲你的作品,然後盡一切辦法堅持下去,但這意味着你會嘗試強制你的對象模型進入這個'UserGroup'中心視圖。

+0

謝謝!我不確定是否需要根查詢。但是我在啓動時加載了整個運行時所需的完整對象圖。我檢索訂單的目的是爲了將它們加載到運行時對象中,然後一系列的邏輯將取決於它們。也許我可以通過查詢來調用各種服務,而不是通過增量來構建對象圖。當然,我必須學習如何編寫這些服務。但是這並不完全清楚,是否有可能在庫方法中使用類似於我現在使用的某些類型的向下鑽取條件? – bretddog

+0

@jonnii - 這是一個有趣的實現。你能提供一些關於你正在使用的FindAll方法/查詢類的實現的更多細節嗎? – csano