我不知道如何做到这一点:
我有一个国家实体。一个国家有零个或多个事实。一个事实具有名为 Year 的属性。
如何按名称加载 Country 实体并急切地获取给定年份(例如 2011 年)的所有事实(但不加载所有其他事实)?这甚至可能吗?
我不知道如何做到这一点:
我有一个国家实体。一个国家有零个或多个事实。一个事实具有名为 Year 的属性。
如何按名称加载 Country 实体并急切地获取给定年份(例如 2011 年)的所有事实(但不加载所有其他事实)?这甚至可能吗?
我认为使用过滤可以做到这一点,但这不是一个好主意,因为它违反了关注点分离:您的域模型不应该用于呈现数据的特殊视图。
两个可能更好的选择:
IEnumerable<Fact>
。除非我有可衡量的性能问题,否则我会选择此选项。Future
,这样它只需要访问数据库一次。我相信这可以通过在 nHibernate 中使用过滤器来实现。从阅读之前的 StackOverflow 问题开始:
NHibernate - 检索仅适用于儿童的标准的父母/儿童
并查看 nHibernate 文档以获取更多参考:
更新: 我还没有解决这个问题。以下 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 解决方案感兴趣,但这很好地解决了它。
编辑:
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();