我已经不知道如何做到这一点:
我有一个国家实体。一个国家有零个或多个事实。事实上有一个名为Year的财产。
如何按名称加载国家/地区实体,并急切地从指定年份获取所有事实,例如2011年(但没有加载所有其他事实)?这甚至可能吗?
答案 0 :(得分:2)
我认为这可以使用过滤,但这不是一个好主意,因为它违反了关注点的分离:您的域模型不应该用于呈现数据的特殊视图。
两个可能更好的选择:
IEnumerable<Fact>
上的扩展方法按年过滤它们。除非我有可衡量的性能问题,否则我会选择此选项。Future
构建两个查询以检索一年的国家/事实,这样它只需要一次访问数据库。答案 1 :(得分:1)
我相信通过在nHibernate中使用过滤器可以实现这一点。首先阅读之前的StackOverflow问题:
NHibernate - Retrieve parent / children with criteria applied only to children
还可以查看nHibernate文档以获得更多参考:
答案 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解决方案感兴趣,但这解决得很好。