NHibernate,获取实体和eager加载子集合的一部分

时间:2012-11-21 13:23:37

标签: nhibernate eager-loading

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

我有一个国家实体。一个国家有零个或多个事实。事实上有一个名为Year的财产。

如何按名称加载国家/地区实体,并急切地从指定年份获取所有事实,例如2011年(但没有加载所有其他事实)?这甚至可能吗?

4 个答案:

答案 0 :(得分:2)

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

两个可能更好的选择:

  1. 获取所有事实并使用IEnumerable<Fact>上的扩展方法按年过滤它们。除非我有可衡量的性能问题,否则我会选择此选项。
  2. 创建一个封装结果集的视图类。您可以使用Future构建两个查询以检索一年的国家/事实,这样它只需要一次访问数据库。

答案 1 :(得分:1)

我相信通过在nHibernate中使用过滤器可以实现这一点。首先阅读之前的StackOverflow问题:

NHibernate - Retrieve parent / children with criteria applied only to children

还可以查看nHibernate文档以获得更多参考:

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

答案 2 :(得分: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();

答案 3 :(得分: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解决方案感兴趣,但这解决得很好。