NHibernate、获取实体和子集合的渴望加载部分

NHibernate、获取实体和子集合的渴望加载部分,nhibernate,eager-loading,Nhibernate,Eager Loading,我在如何做到这一点上没有下定决心: 我有一个国家实体。一个国家没有或有更多的事实。有一个事实叫做“年” 如何按国家实体的名称加载该实体,并急切地从给定年份(例如2011年)获取其所有事实(但不加载所有其他事实)?这是可能的吗?我相信在nHibernate中使用过滤器是可能的。首先阅读前面的问题: 并查看nHibernate文档以获取更多参考: 我相信在nHibernate中使用过滤器是可能的。首先阅读前面的问题: 并查看nHibernate文档以获取更多参考: 编辑: var query

我在如何做到这一点上没有下定决心:

我有一个国家实体。一个国家没有或有更多的事实。有一个事实叫做“年”


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

我相信在nHibernate中使用过滤器是可能的。首先阅读前面的问题:

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


我相信在nHibernate中使用过滤器是可能的。首先阅读前面的问题:

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

编辑:

 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();
var query=session.QueryOver()
.Fetch(c=>c.Facts)
.Eager()
.TransformUsing(NHibernate.Transform.Transformers.DistincTroperty)
.Future();
session.QueryOver()
其中(f=>f.年份==2011年)
.Future();
var country=query.List().FirstOrDefault();
编辑:

 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();
var query=session.QueryOver()
.Fetch(c=>c.Facts)
.Eager()
.TransformUsing(NHibernate.Transform.Transformers.DistincTroperty)
.Future();
session.QueryOver()
其中(f=>f.年份==2011年)
.Future();
var country=query.List().FirstOrDefault();
更新: 我还没有解决这个问题。以下HQL仅在存在事实时有效。如果给定年份没有事实,则结果为空。考虑到我的上下文,我认为正确的解决方案是将事实视为聚合根,并使用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});
var country=Session.CreateQuery(“从country country左连接获取country.Facts作为事实,其中Facts.Year in(:years)和country.Name=:Name”);
country.SetParameter(“名称”,名称);
country.SetParameterList(“年份”,新列表(){2012,2011});
谢谢你的其他建议。我对这个问题的非HQL解决方案很感兴趣,但这很好地解决了它。

更新: 我还没有解决这个问题。以下HQL仅在存在事实时有效。如果给定年份没有事实,则结果为空。考虑到我的上下文,我认为正确的解决方案是将事实视为聚合根,并使用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});
var country=Session.CreateQuery(“从country country左连接获取country.Facts作为事实,其中Facts.Year in(:years)和country.Name=:Name”);
country.SetParameter(“名称”,名称);
country.SetParameterList(“年份”,新列表(){2012,2011});

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

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

两个可能更好的选择:

  • 获取所有事实并使用
    IEnumerable
    上的扩展方法按年份筛选它们。我会选择这个选项,除非我有一个可测量的性能问题
  • 创建一个封装结果集的视图类。您可以使用
    Future
    构造两个查询来检索一年的国家和事实,这样只需要访问数据库一次

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

    两个可能更好的选择:

  • 获取所有事实并使用
    IEnumerable
    上的扩展方法按年份筛选它们。我会选择这个选项,除非我有一个可测量的性能问题
  • 创建一个封装结果集的视图类。您可以使用
    Future
    构造两个查询来检索一年的国家和事实,这样只需要访问数据库一次

  • 嗨,Mariusz,谢谢你的回答。不幸的是,这似乎没有编译?“应为方法、委托或事件。”此外,表达式f=>f.Year==2011未编译,因为“f”未被理解。确定-对Eager的调用应该是对属性的调用,而不是对方法的调用。但是Where()子句不能编译,因为f是Country,而不是FactMariusz,谢谢。这在一次数据库命中中运行两个查询,但返回的结果包含所有事实,而不仅仅是2011年的事实。嗨,Mariusz,谢谢你的回答。不幸的是,这似乎没有编译?“应为方法、委托或事件。”此外,表达式f=>f.Year==2011未编译,因为“f”未被理解。确定-对Eager的调用应该是对属性的调用,而不是对方法的调用。但是Where()子句不能编译,因为f是Country,而不是FactMariusz,谢谢。这在一次数据库命中中运行两个查询,但返回的结果包含所有事实,而不仅仅是2011年的事实。谢谢Jamie。我同意过滤不是正确的方法。谢谢杰米。我同意过滤不是正确的方法。