JoinAlias vs. Joinquery对Rowcount的差异

时间:2015-04-29 12:43:40

标签: sql nhibernate

从我理解的所有内容来看,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。

1 个答案:

答案 0 :(得分:0)

第一个问题解决了安德鲁。第二个是笛卡尔积。

请检查:NHibernate Fetch/FetchMany duplication in resultset, how to fix with ToFuture()

当我们与孩子一起加入root时 - 结果集会成倍增加。我们有孩子会有尽可能多的行。没有那么多我们有根。

我的建议是,使用批量获取事后加载集合,只查询Root实体。要按子级过滤,请使用子查询...

检查如何使用批量提取:

如何使用子查询只过滤root:

独特的根实体如何运作?