0

我不知道如何做到这一点:

我有一个国家实体。一个国家有零个或多个事实。一个事实具有名为 Year 的属性。

如何按名称加载 Country 实体并急切地获取给定年份(例如 2011 年)的所有事实(但不加载所有其他事实)?这甚至可能吗?

4

4 回答 4

2

我认为使用过滤可以做到这一点,但这不是一个好主意,因为它违反了关注点分离:您的域模型不应该用于呈现数据的特殊视图。

两个可能更好的选择:

  1. 使用扩展方法获取所有事实并按年份过滤它们IEnumerable<Fact>。除非我有可衡量的性能问题,否则我会选择此选项。
  2. 创建一个封装结果集的视图类。您可以构建两个查询来检索一年的 Country 和 Facts Future,这样它只需要访问数据库一次。
于 2012-11-21T15:32:20.020 回答
1

我相信这可以通过在 nHibernate 中使用过滤器来实现。从阅读之前的 StackOverflow 问题开始:

NHibernate - 检索仅适用于儿童的标准的父母/儿童

并查看 nHibernate 文档以获取更多参考:

http://nhibernate.info/doc/nh/en/index.html#filters

于 2012-11-21T13:37:19.160 回答
0

更新: 我还没有解决这个问题。以下 HQL 仅在存在事实时才有效。如果给定年份没有事实,则结果为空。根据我的上下文,我认为正确的解决方案是将 Fact 视为聚合根并使用 Future() 发出两个查询。

原帖

我已经使用 HQL 解决了这个问题:

var country = Session.CreateQuery("from Country country left join fetch country.Facts as Facts where Facts.Year in (:years) and country.Name = :name ");
country.SetParameter("name", name);
country.SetParameterList("years", new List<int>() {2012, 2011});

感谢其他建议。我会对这个问题的非 HQL 解决方案感兴趣,但这很好地解决了它。

于 2012-11-21T15:30:08.043 回答
0

编辑:

 var query = session.QueryOver<Country>()
        .Fetch(c => c.Facts)
        .Eager()
        .TransformUsing(NHibernate.Transform.Transformers.DistinctRootEntity)
        .Future();
    session.QueryOver<Facts>()
        .Where(f => f.Year == 2011)
        .Future();
    var country = query.List().FirstOrDefault();
于 2012-11-21T13:58:24.873 回答