从我理解的所有内容来看,JoinAlias应该在各方面与joinquery功能类似,但返回对象。 IE JoinAlias返回外部IQueryOver,JoinQueryOver返回一个连接对象。但是在以下示例中:
query.Left.JoinAlias(() => eventAlias.Children, () => childAlias);
query.Where(() => childAlias.Name.IsIn(SearchCriteria.SelectedNames.ToArray()));
RowCount是29。
但是在这里:
query.Left.JoinQueryOver(s => s.Children).Where(Restrictions.In(Projections.Property<Child>(x => x.Name),
SearchCriteria.SelectedNames.ToArray()));
query.RowCount();返回18。
18正是我想要的。 db上有18个条目。
我对DistinctRootEntityResultTransformer()进行了一些研究,它在别名之后将计数带到了14,但这仍然不正确。
在高层次上,我希望更好地了解正在发生的事情,如果我需要使用Alias,我想知道如何处理它。
由于
---编辑--- 所以这应该是一个左连接,因为计数可以是0,我只想要父项。如答案中所述,当我使用相同的连接(左)运行完全相同的过滤器时,结果是相同的。但是,当没有人搜索时,我仍然会创建别名,而且根本没有过滤我得到29。
答案 0 :(得分:0)
第一个问题解决了安德鲁。第二个是笛卡尔积。
请检查:NHibernate Fetch/FetchMany duplication in resultset, how to fix with ToFuture()
当我们与孩子一起加入root时 - 结果集会成倍增加。我们有孩子会有尽可能多的行。没有那么多我们有根。
我的建议是,使用批量获取事后加载集合,只查询Root实体。要按子级过滤,请使用子查询...
检查如何使用批量提取:
如何使用子查询只过滤root:
独特的根实体如何运作?