FluentNhibernate,检索部分对象图

时间:2011-08-15 21:57:32

标签: c# .net fluent-nhibernate repository object-graph

因此,我将使用FluentNHibernate调用存储库来检索复杂对象图的根对象。但对于某些子级别对象,我不想检索所有元素,而只检索日期参数等于某些条件的元素。在下面的代码中,我希望OrderTime字段以这种方式过滤较低级别的Order对象。

含义我想要检索所有用户的所有UserGroup,但每个User的Orders对象只包含来自特定日期或日期范围的订单。

那么我对如何检索这个对象图有什么选择呢?我不想延迟加载,我只想指定一些不同的检索条件,这些条件永远不会改变。所以它们可以是存储库的独立功能,就像最后建议的那样。 但是我如何编写这些方法,如何指定这些条件?

物件:

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)
{
}

1 个答案:

答案 0 :(得分:0)

这实际上取决于你想对订单做什么。

您是否需要查询聚合根?相反,按日期查询实际订单是否有意义?所以你最终得到:

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

如果您的关联设置正确,您仍然可以导航到该用户。

我个人认为存储库模式有点限制,宁愿使用查询对象,所以你最终得到的结果如下:

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

但是,如果存储库的概念适合您,那么一定要坚持下去,但这意味着您将尝试将对象模型强制转换为这个“UserGroup”中心视图。