因此,我将使用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)
{
}
答案 0 :(得分:0)
这实际上取决于你想对订单做什么。
您是否需要查询聚合根?相反,按日期查询实际订单是否有意义?所以你最终得到:
session.QueryOver<Order>().Where(t => t.OrderDate > ...);
如果您的关联设置正确,您仍然可以导航到该用户。
我个人认为存储库模式有点限制,宁愿使用查询对象,所以你最终得到的结果如下:
queryService.FindAll<UserGroup>(new GetAllByFilterOrderDate(DateTime.Now));
但是,如果存储库的概念适合您,那么一定要坚持下去,但这意味着您将尝试将对象模型强制转换为这个“UserGroup”中心视图。