FluentNhibernate,检索部分对象图

发布于 2024-11-29 20:58:41 字数 1229 浏览 0 评论 0原文

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

意思是我想检索所有用户组和所有用户,但每个用户的订单对象应仅包含特定日期或日期范围内的订单。

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

对象:

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

So I will call a repository to retrieve the root object of a complex object graph, using FluentNHibernate. But for some sub-level objects I don't want to retrieve all elements, but only those where a date parameter equals certain condition. In below code, I want the lower level Order object to be filtered in this way by the OrderTime field.

Meaning I want to retrieve all UserGroups, with all Users, but the Orders object of each User shall only contain orders from a specific date or date range.

So what are my options on how to retrieve this object graph? I don't want lazy loading, I just want to specify a handful of different retrieval conditions, which will never change. So they can be separate functions of the repository, like suggested at the end. But how would I go about coding those methods, how to specify these conditions?

Objects:

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;
}

Repository:

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

Potential new Repository methods: ?

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

这样的小城市 2024-12-06 20:58:41

这实际上取决于您想如何处理订单。

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

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

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

就我个人而言,我发现存储库模式有点限制性,并且宁愿使用查询对象,因此您最终会得到类似的结果:

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

但是,如果存储库的概念适合您,那么无论如何都要坚持它,但这意味着您将尝试强制您的对象模型进入此以“用户组”为中心的视图。

It really depends on what you want to do with the orders.

Is there a reason you need to query on the aggregate root? Would it make sense to query over the actual orders by date instead? So you'd end up with:

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

If your associations are set up correctly you'll still be able to navigate to the user.

Personally I find the repository pattern to be a bit restrictive and would rather use query objects, so you'd end up with something like:

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

However if the concept of a repository works for you then by all means stick to it, but it means you'll try to force your object model into this 'UserGroup' centric view.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文