FluentNhibernate,检索部分对象图

本文关键字:对象图 检索部 FluentNhibernate | 更新日期: 2023-09-27 18:05:34

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

意思是我想检索所有UserGroups和所有Users,但是每个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;
        }
    }
}

潜在的新Repository方法:?

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

FluentNhibernate,检索部分对象图

这取决于你想如何处理订单。

是否有需要查询聚合根的原因?按日期查询实际订单有意义吗?所以你最终会得到:

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

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

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

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

然而,如果存储库的概念适合你,那么无论如何坚持它,但这意味着你将试图强迫你的对象模型进入这个以'UserGroup'为中心的视图