Sql JoinAlias与Joinquery关于行数差异的比较

Sql JoinAlias与Joinquery关于行数差异的比较,sql,nhibernate,Sql,Nhibernate,据我所知,除了返回对象之外,JoinAlias在功能上应该与joinquery在所有方面都类似。IE JoinAlias返回外部IQueryOver,JoinQueryOver为join对象返回一个。但是,在以下示例中: query.Left.JoinAlias(() => eventAlias.Children, () => childAlias); query.Where(() => childAlias.Name.IsIn(SearchCriteri

据我所知,除了返回对象之外,JoinAlias在功能上应该与joinquery在所有方面都类似。IE JoinAlias返回外部IQueryOver,JoinQueryOver为join对象返回一个。但是,在以下示例中:

    query.Left.JoinAlias(() => eventAlias.Children, () => childAlias);  

    query.Where(() => childAlias.Name.IsIn(SearchCriteria.SelectedNames.ToArray()));
行数是29

但在这里:

  query.Left.JoinQueryOver(s => s.Children).Where(Restrictions.In(Projections.Property<Child>(x => x.Name),
                    SearchCriteria.SelectedNames.ToArray()));
query.Left.JoinQueryOver(s=>s.Children).Where(Restrictions.In(Projections.Property(x=>x.Name)),
SearchCriteria.SelectedNames.ToArray());
query.RowCount();返回18

18岁正是我想要的。数据库中有18个条目

我对DistinctRootEntityResultTransformer()做了一些研究,它将别名后的计数增加到14,但这仍然是不正确的

在较高的层次上,我想更好地了解正在发生的事情,在直接的层次上,我想知道如果需要使用Alias,该怎么做

谢谢

---编辑---
这应该是一个左连接,因为计数可以是0,我只需要父项。如回答中所述,当我使用相同的联接(左)运行完全相同的筛选器时,结果是相同的。但是,当没有人搜索时,我仍然会创建别名,而且根本没有过滤,我得到了29个别名。

第一个问题解决了。第二个是关于笛卡尔积

选中此项:

当我们把根和子元素连接起来时,结果集就会成倍增加。会有和我们孩子一样多的争吵。我们没有那么多根

我的建议是,使用批处理抓取来事后加载集合,只查询根实体。要按子项筛选,请使用子查询

检查如何使用批处理获取:

  • 文件-
如何使用子查询仅筛选根:

不同的根实体是如何工作的


我现在已经删除了我的答案——您是否尝试过使用探查器查看生成了什么SQL并将两者进行比较?我正在研究这个问题。我没有在这台机器上设置nhibernate探查器。@AndrewHitaker我想说,没有必要删除您的答案,因为它肯定是有效的,并且与其中一个问题有关。。